社区讨论
统计答案出错,80分和100分
P2073送花参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mhjiflkq
- 此快照首次捕获于
- 2025/11/04 03:05 4 个月前
- 此快照最后确认于
- 2025/11/04 03:05 4 个月前
本人的代码在6和9两个点出错,但是换了最后一步的统计答案方法就对了,不懂原方法错在哪里,以下是原始代码(80分)
CPP#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N = 1000006;
int v[N];//存储美丽值
long long ans = 0, re = 0;
//两个堆
priority_queue<int, vector<int>>A;
priority_queue<int, vector<int>, greater<int>>B;
int main(void) {
int t;
memset(v, 0, sizeof(v));
while (cin >> t && t > 0) {
if (t == 1) {
int w, c;
cin >> w >> c;
if (v[c] > 0)continue;
A.push(c);
B.push(c);
v[c] = w;//标记
}
else if (t == 2) {
while (!A.empty()) {
int k = A.top();
A.pop();
if (v[k] > 0) {
v[k] = 0;
break;//如果有效的花朵被筛出,就停止
}
}
}
else if (t == 3) {
while (!B.empty()) {
int k = B.top();
B.pop();
if (v[k] > 0) {
v[k] = 0;
break;//同上
}
}
}
}
while (!A.empty()) {//遍历A统计,因为A一定包含所有的被选定花束
int k = A.top();
A.pop();
if (v[k] > 0) {//如果没被拿出
re += k;
ans += v[k];
}
}
cout << ans << ' ' << re << endl;
return 0;
}
下面这段代码取代的是最后遍历A这个堆的部分(如果改成遍历B这个堆会得到60分)
CPPfor (int i = 1; i < N; i++) {
if (v[i] > 0) {
ans += v[i];
re += i;
}
}
请问是为什么,A不是已经包含所有被选择的花束了吗,而且用v数组判断一下,就很容易把被筛出去的花束跳过,为什么还会不对。换成最后遍历B就会变成60分,A的话是80?????直接暴力统计v数组就是100
回复
共 0 条回复,欢迎继续交流。
正在加载回复...