我可以卑微地吐槽下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 浙江

相关推荐

评论
7
1
分享

创作者周榜

更多
正在热议
更多
# 长得好看会提高面试通过率吗? #
3876次浏览 45人参与
# 离家近房租贵VS离家远但房租低,怎么选 #
16896次浏览 137人参与
# MiniMax求职进展汇总 #
25140次浏览 321人参与
# 春招至今,你的战绩如何? #
15716次浏览 144人参与
# 你的实习产出是真实的还是包装的? #
3051次浏览 53人参与
# 沪漂/北漂你觉得哪个更苦? #
1553次浏览 41人参与
# 米连集团26产品管培生项目 #
7287次浏览 226人参与
# HR最不可信的一句话是__ #
1091次浏览 32人参与
# AI面会问哪些问题? #
946次浏览 23人参与
# 你做过最难的笔试是哪家公司 #
1247次浏览 22人参与
# AI时代,哪个岗位还有“活路” #
2853次浏览 51人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152905次浏览 889人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
8021次浏览 43人参与
# XX请雇我工作 #
51155次浏览 171人参与
# 简历第一个项目做什么 #
32148次浏览 361人参与
# 简历中的项目经历要怎么写? #
311051次浏览 4265人参与
# 投格力的你,拿到offer了吗? #
178337次浏览 891人参与
# 你最满意的offer薪资是哪家公司? #
76978次浏览 375人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
187605次浏览 1123人参与
# AI时代,哪些岗位最容易被淘汰 #
64730次浏览 886人参与
# 如果重来一次你还会读研吗 #
230018次浏览 2011人参与
# 正在春招的你,也参与了去年秋招吗? #
364336次浏览 2642人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务