社区讨论

为什么用队列会RE??? 70分求调

P1309[NOIP 2011 普及组] 瑞士轮参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@m26ikuwn
此快照首次捕获于
2024/10/13 02:52
去年
此快照最后确认于
2025/11/04 17:20
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
#include <stdlib.h>
using namespace std;

struct dd {
	int w;//武力
	int s;//分
	int p;//编号

} pe[200010];
queue<dd>win, los, k;

bool cmp(dd x, dd y) {
	if (x.s > y.s) {
		return true;
	}
	if (x.s == y.s && x.p < y.p ) {
		return true;

	}
	return false;
}
int  n = 0, r, q, a;

int main() {
	cin >> n >> r >> q;
	a = 2 * n;
	for (int i = 1; i <= a; i++) {
		cin >> pe[i].s;
		pe[i].p = i;
	}
	for (int i = 1; i <= a; i++) {
		cin >> pe[i].w;
	}
	sort(pe + 1, pe + a + 1, cmp);

	for (int i = 1; i <= r; i++) {
		for (int j = 2; j <= a; j += 2) {

			if ((pe[j].w > pe[j - 1].w)) {
				pe[j].s++;
				win.push(pe[j]);
				los.push(pe[j - 1]);

			}
			if (pe[j - 1].w > pe[j].w) {
				pe[j - 1].s++;
				los.push(pe[j]);
				win.push(pe[j - 1]);
			}

		}
		while (!win.empty() && !los.empty()) {
			if (win.front().s > los.front().s) {
				k.push(win.front());
				win.pop();
			}
			if (win.front().s < los.front().s) {
				k.push(los.front());
				los.pop();
			}
			if (win.front().s == los.front().s) {
				if (win.front().p > los.front().p) {
					k.push(los.front());
					los.pop();
				} else {
					k.push(win.front());
					win.pop();
				}
			}
		}
		while (!win.empty()) {
			k.push(win.front());
			win.pop();
		}
		while (!los.empty()) {
			k.push(los.front());
			los.pop();
		}
		int aa = 1;
		while (!k.empty()) {
			pe[aa++] = k.front();
			k.pop();
		}
	}
	cout << pe[q].p ;

}

回复

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

正在加载回复...