小红书笔试 2/3 第三题0%

第一题

数组随机移除一个元素,求两次移除刚好是左右两端的概率

    static void solve() throws IOException {
        int n = in.nextInt();
        double res = 1.0;
        // if (n == 2) {out.printf("%.10f\n", res); return;}
        // 1/n * 1/(n-1) * C(2, 1)
        res = 2.0 / n / (n - 1);
        out.printf("%.10f\n", res);
    }

第二题

    static void solve() throws IOException {
        int n = in.nextInt();
        int x = in.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++) { a[i] = in.nextInt(); }
        Arrays.sort(a);
        // 暴力做 使用多次推荐和不使用多次推荐都求一次 取最小
        // 不使用多次推荐即为背包, 若使用多次推荐也可以作为背包问题求解(预设背包容量)
        int ans = func(a, -1, x);
        for (int i = 0; i < n; i++) {
            ans = Math.min(ans, func(a, i, x));
        }
        out.println(ans == 0x3f3f3f3f ? -1 : ans);
    }

    static int func(int[] a, int idx, int x) {
        int n = a.length;
        int use = 0;
        if (0 <= idx && idx < n && x >= a[idx]) {
            x -= a[idx];
            use++;
        }
        // dp[i][j] 表示在[0, i]中选物品装满容量为j的背包所需的最少物品数
        int[] dp = new int[x + 1];
        for (int i = 1; i <= x; i++) { dp[i] = 0x3f3f3f3f; }
        for (int i = 1; i <= n; i++) {
            if (i  == (idx + 1)) continue;
            int w = a[i - 1] / 2;
            for (int j = x; j >= w; j--) {
                dp[j] = Math.min(dp[j], dp[j - w] + 1);
            }
        }
        return dp[x] + use;
    }

第三题

写的 if else 屎山 最后几分钟排查逻辑错误也没排查出来

看用例才知道点赞数允许同时最大,所以 maxCnt 后面没用上,代码逻辑如下:

1、如果 a[i] 是 max 直接输出 sum

2、a[i] 不是 max ,计算其它数不超过 max 时可增加多少,记作 cnt,如果 cnt >= max - a[i] , 那么 让 a[i] 增加到与 max 一样大即可,所以输出 sum + (max - a[i]) * 2

3、如果 cnt < max - a[i],先把能增加的 cnt 全加上 ,此时 a[i] = a[i] + cnt ,sum = sum + cnt * 2 其余数均等于 max

列出方程 a[i] + x >= (sum + x) / (n - 1) 解出 x 即可

最后输出 sum + cnt * 2 + x

但第三步逻辑有点问题,用例输出 9, 16, 8 16 比 15 大了 1。求大佬解惑!

    static void solve() throws IOException {
        // 贪心 需要的信息 其取 a[i] 后数组中的最大值 除去a[i]后数组的和
        int n = in.nextInt();
        int[] a = new int[n];
        int max = -1, maxCnt = 0;
        long sum = 0;
        for (int i = 0; i < n; i++) {
            a[i] = in.nextInt();
            if (a[i] > max) {
                max = a[i];
                maxCnt = 1;
            } else if (a[i] == max) {
                maxCnt++;
            }
            sum += a[i];
        }
        if (n == 1) { out.println(a[0]); }
        if (n == 2) {
            if (a[0] < a[1]) { out.println(-1); out.println(a[0] + a[1]); }
            else if (a[0] == a[1]) { out.println(a[0] + a[1]); out.println(a[0] + a[1]); }
            else { out.println(a[0] + a[1]); out.println(-1); }
        }
        for (int i = 0; i < n; i++) {
            if (a[i] == max) {
                out.println(maxCnt == 1 ? sum : sum);
            } else {
                long cnt = (long) (n - 1) * max - (sum - a[i]);
                if (cnt >= max - a[i]) {
                    out.println(sum + ((long) max - a[i]) * 2);
                } else { 
                    long x = (sum + cnt * 2 - (long) a[i] * (n - 1)) / (n - 1);
                    out.println(sum + cnt * 2 + x);
                }
            }
        }
    }
#小红书笔试##小红书##笔试##java##软件开发2024笔面经#
全部评论
忘记能二分答案了😅
点赞 回复
分享
发布于 04-09 22:15 江苏

相关推荐

4 3 评论
分享
牛客网
牛客企业服务