我可以卑微地吐槽下E吗?最后一组数据诡异读取失败

这题的反悔堆,我的思路是对的。

因为我赛后,找朋友帮忙把java代码翻译成c++, 然后就过了。

在比赛过程中,提交的时候,反馈是 RE,就是执行错误,可能存在数组越界之类。

我反复check代码,觉得不可能犯这种低级错误。

然后就用二分代码,加try/catch, 试图确定抛异常的点。因为比赛中是隐藏异常栈信息的。

确实能定位到输入哪块出问题, 很诡异,比赛结束也是如此反馈。

反正累计re/wa了20次

反正测试下来,最后一组数据,n=1000000,但是我这边只读到999999个

JAVA的输入方式

Scanner sc = new Scanner(new BufferedInputStream(System.in));

int n = sc.nextInt();
long k = sc.nextLong();
long[] arr = new long[n];
for (int i = 0; i < n; i++) {
  arr[i] = sc.nextLong();
}

java的代码 ( 最后一组数据输入 异常)

import java.io.*;
import java.util.*;

public class Main {

    public static void main(String[] args) {

        Scanner sc = new Scanner(new BufferedInputStream(System.in));

        int n = sc.nextInt();
        long k = sc.nextLong();

        int nk = 0;
        long[] arr = new long[n];
        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextLong();
            if (arr[i] >= 0) nk++;
        }

        // 后悔堆
        PriorityQueue<Long> pp = new PriorityQueue<>(Comparator.comparing(x -> -x));

        long acc = 0;
        long pacc = 0;
        int minus = 0;

        for (int i = 0; i < n; i++) {
            if (arr[i] >= 0) {
                acc += arr[i];
            } else {
                minus++;
                long tv = -1l * arr[i];
                if ((pacc + tv <= k) && (pacc + tv <= acc || pp.size() + 1 < minus)) {
                    pp.offer(tv);
                    pacc += tv;
                } else {
                    if (!pp.isEmpty() && pp.peek() > tv) {
                        pacc -= pp.poll();
                        pp.offer(tv);
                        pacc += tv;
                    }
                }
            }
        }
        System.out.println(nk + pp.size());

    }

}

c++的代码 (AC的代码)

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    int n;
    long long k;

    cin >> n >> k;

    int nk = 0;
    vector<long long> arr(n);

    for (int i = 0; i < n; i++) {
        cin >> arr[i];
        if (arr[i] >= 0) nk++;
    }

    // 后悔堆
    priority_queue<long long> pp;

    long long acc = 0;
    long long pacc = 0;
    int minus = 0;

    for (int i = 0; i < n; i++) {
        if (arr[i] >= 0) {
            acc += arr[i];
        } else {
            minus++;
            long long tv = -1LL * arr[i];
            if ((pacc + tv <= k) && (pacc + tv <= acc || pp.size() + 1 < minus)) {
                pp.push(tv);
                pacc += tv;
            } else {
                if (!pp.empty() && pp.top() > tv) {
                    pacc -= pp.top();
                    pp.pop();
                    pp.push(tv);
                    pacc += tv;
                }
            }
        }
    }

    cout << nk + pp.size() << '\n';

    return 0;
}

这是我遇到过的,第一次莫名其妙Re测试数据输入的。

全部评论
非常抱歉,确实有一组简单的测试用例少了一个输入,但不影响答案,现在已经更正。
2 回复 分享
发布于 2023-09-02 15:05 浙江

相关推荐

10-25 00:32
香梨想要offer:感觉考研以后好好学 后面能乱杀,目前这简历有点难
点赞 评论 收藏
分享
评论
7
1
分享
牛客网
牛客企业服务