我可以卑微地吐槽下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测试数据输入的。