携程笔试第四题为什么0分?

import java.io.*;
import java.util.ArrayDeque;
import java.util.Deque;

public class Main {
    private static long n, k, sum, intervalSum, res;
    private static final int N = 100010;
    private static long[] a = new long[N], s = new long[N];
    private static Deque<Long[]> q = new ArrayDeque<>();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] in = br.readLine().split(" ");
        n = Long.valueOf(in[0]);
        k = Long.valueOf(in[1]);
        sum = Long.valueOf(in[2]);
        in = br.readLine().split(" ");
        for (int i = 1; i <= n; i++) {
            a[i] = Long.valueOf(in[i - 1]);
        }
        intervalSum = calculateSum(1, (int) k);
        processFirstInterval();
        for (int i = (int) k + 1; i <= n; i++) {
//            bw.write("first interval sum : " + intervalSum + "\n");
            // 滑动窗口
            intervalSum -= q.pollFirst()[0];
//            bw.write(q.peekFirst()[0] + " ");
            q.offerLast(new Long[]{a[i], (long) i});
            intervalSum += q.peekLast()[0];
//            bw.write("interval sum : " + intervalSum + "\n");
            // 处理超过sum的情况
            if (intervalSum > sum) {
                a[i] -= intervalSum - sum;
                res += intervalSum - sum;
                q.pollLast();
                q.offerLast(new Long[]{a[i], (long) i});
            }
        }
//        for (int i = 1; i <= n; i++) {
//            bw.write(String.format("%d ", a[i]));
//        }
        bw.write(res + "");
        bw.flush();
    }
    private static long calculateSum(int st, int ed) {
        long res = 0L;
        for (int i = st; i <= ed; i++) {
            res += a[i];
        }
        return res;
    }

    private static void processFirstInterval() {
        int tail = (int) k;
        if (intervalSum <= sum) {
            return;
        }
        while (intervalSum - sum >= a[tail]) {
            intervalSum -= a[tail];
            res += a[tail];
            a[tail--] = 0;
        }
        if (intervalSum - sum < a[tail]) {
            res += intervalSum - sum;
            a[tail] -= intervalSum - sum;
            intervalSum = sum;
        }
        for (int i = 1; i <= k; i++) {
            q.offerLast(new Long[]{a[i], (long) i});
        }
    }
}

我自测样例:

5 4 10

9 7 3 6 5

答案难道不是15?我想破脑袋也想不出来15以外的答案。

#牛客解忧铺#
全部评论
哎呀,看起来你在解决这个编程问题时遇到了难题呢,真是让人头疼。不过别担心,我们一起来看看代码里可能存在的问题吧!你提到的样例答案是15,让我们看看代码的逻辑是否和你预期的相符哦。 首先,你的代码是用来解决一个关于滑动窗口和调整数组元素的问题,对吧?我看到你在处理超过sum的情况时,直接从数组a中减去了多出的部分,并且更新了结果res。但是,似乎你没有考虑到更新intervalSum的值。 让我们来检查一下代码中的这一部分: ```java if (intervalSum > sum) { a[i] -= intervalSum - sum; res += intervalSum - sum; q.pollLast(); q.offerLast(new Long[]{a[i], (long) i}); } ``` 这里,当你发现intervalSum大于sum时,你从a[i]中减去了多出的部分,并且更新了res,但是你没有相应地更新intervalSum的值。这可能就是问题的根源哦。 你可以尝试在调整a[i]之后,重新计算intervalSum,看看结果是否会变成你预期的15呢? 另外,牛可乐在这里提醒你,如果想要更深入地讨论代码问题,我们可以私信聊聊哦,点击我的头像就可以发起私信啦!这样我们可以更细致地分析问题,帮你找到解决方案。加油!
点赞 回复 分享
发布于 09-05 21:05 AI生成
这个样例是5 4 10吗?好像是5 3 10呢
点赞 回复 分享
发布于 09-05 21:11 浙江
说一下你的具体思路吧,代码看着太多了,我想的是每次对窗口靠右的数操作
点赞 回复 分享
发布于 09-06 08:50 天津
你在main函数里面是不是没有把超了的窗口和重置为sum
点赞 回复 分享
发布于 09-06 09:10 北京

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务