阿里巴巴3.30号笔试,第二题

import java.text.DecimalFormat;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] arr = new int[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        int[][] arr1 = new int[n][n];
        for (int i = n - 1; i  >= 0; i--) {
            int max = Integer.MIN_VALUE;
            for (int j = i; j >= 0; j--) {
                if (max < arr[j]) {
                    arr1[n - 1 - i][j] = arr[j];
                    max = arr[j];
                } else {
                    arr1[n - 1 - i][j] = max;
                }

            }
        }
        double a = (n + 1) * n / 2;
        double b = 0;


        for (int i = n - 1; i >= 0; i--) {
            for (int j = i; j >= 0; j--) {
                b += arr1[n - 1 - i][j];
            }


        }

        double res = b / a;
        DecimalFormat df = new DecimalFormat("#0.000000");
        System.out.println(df.format(res));

    }

}















#阿里笔试##笔试题目##阿里巴巴#
全部评论
可以说一下题目吗大佬
点赞 回复 分享
发布于 2020-03-30 20:18
这道题在哪里可以测啊?我想测一下我的代码
点赞 回复 分享
发布于 2020-03-30 20:32
我刚开始默认的升序,晕死,做了一个小时没出来。
点赞 回复 分享
发布于 2020-03-30 20:33
我感觉需要用一个dp[n][2] public static void main(String[] args) {         Scanner scanner = new Scanner(System.in);         int n = scanner.nextInt();         int[] arr = new int[n];         for (int i = 0; i < n; i++) {             arr[i] = scanner.nextInt();         }         scanner.close();         int[][] dp = new int[n][2];         for (int i = 0; i < n; i++) {             if (i > 0 && arr[i] > arr[i - 1]) {                 dp[i][0] = dp[i - 1][0] + 1;             }         }         for (int i = n - 1; i >= 0; i--) {             if (i < n - 1 && arr[i] > arr[i + 1]) {                 dp[i][1] = dp[i + 1][1] + 1;             }         }         int sum = 0;         int count = 0;         for (int i = 0; i < n; i++) {             sum += (dp[i][0] + 1 + dp[i][1] + dp[i][0] * dp[i][1]) * arr[i];             count += dp[i][0] + 1 + dp[i][1] + dp[i][0] * dp[i][1];         }         float result = sum / (float) count;         System.out.printf("%.6f", result);     }
点赞 回复 分享
发布于 2020-03-30 20:34
大佬你好,这是AC了吗
点赞 回复 分享
发布于 2020-03-30 21:21
请问还记得第一题的示例么
点赞 回复 分享
发布于 2020-03-30 21:33
大佬们,我这种做法对吗?     public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         int n = sc.nextInt();         int[] arr = new int[n];         // 读取数据         for (int i = 0; i < n; i++) {             arr[i] = sc.nextInt();         }         long sum = 0L;         // dp[l][r]记录[l..r]区间的最大值是什么         int[][] dp = new int[n][n];         // 初始情况 区间只有一个元素 => dp[i][i] = arr[i]         for (int i = 0; i < n; i++) {             dp[i][i] = arr[i];             sum += arr[i];         }         // 从区间长度为2的时候开始计算dp 区间长度为 i = l-r+1         for (int i = 2; i <= n; i++) {             // 左端点从0开始,右端点不能大于n 为结束条件             for (int l = 0; i + l -1 < n ; l++) {                 int r = i + l - 1;                 dp[l][r] = Math.max(arr[r], dp[l][r-1]);                 // 累加最大值                 sum += dp[l][r];             }         }         int totalCount = (n+1)*n/2;         double res = (double) sum / totalCount;         System.out.format("%.6f", res);     }
点赞 回复 分享
发布于 2020-03-30 21:59
你好小飞,请问你的代码是AC了吗
点赞 回复 分享
发布于 2020-03-31 10:24

相关推荐

11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
5
分享
牛客网
牛客企业服务