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