社区讨论

统计答案出错,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分)

CPP
for (int i = 1; i < N; i++) {
  if (v[i] > 0) {
    ans += v[i];
    re += i;
  }
}
请问是为什么,A不是已经包含所有被选择的花束了吗,而且用v数组判断一下,就很容易把被筛出去的花束跳过,为什么还会不对。换成最后遍历B就会变成60分,A的话是80?????直接暴力统计v数组就是100

回复

0 条回复,欢迎继续交流。

正在加载回复...