社区讨论

70pts求调

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lo10panv
此快照首次捕获于
2023/10/22 13:17
2 年前
此快照最后确认于
2023/11/02 12:47
2 年前
查看原帖
C
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int n,r,q,w[100010];
struct GGBond{
	int s;
	int num;
}per[200010],win[100010],lose[100010];
bool cmp(GGBond a,GGBond b){
	if(a.s==b.s) return a.num<b.num;
	return a.s>b.s;
}
void MyLittlePony(){
	int i=1,j=1,k=1;
	while(i<=n && j<=n){
		if(win[i].s>lose[j].s || (win[i].s==lose[j].s && win[i].num<lose[j].num)){
			per[k].num=win[i].num;
			per[k++].s=win[i++].s;
		}else{
			per[k].num=lose[j].num;
			per[k++].s=lose[j++].s;
		}
	}
	while(i<=n){
		per[k].num=win[i].num;
		per[k++].s=win[i++].s;
	}
	while(j<=n){
		per[k].num=lose[j].num;
		per[k++].s=lose[j++].s;
	}
	return;
}
int main(){
	scanf("%d%d%d",&n,&r,&q);
	for(int i=1;i<=2*n;i++){
		scanf("%d",&per[i].s);
		per[i].num=i;
	}
	for(int i=1;i<=2*n;i++)
		scanf("%d",&w[i]);
	sort(per+1,per+1+2*n,cmp);
//	for(int i=1;i<=2*n;i++){//
//		printf("0:%d %d %d\n",per[i].num,per[i].s,w[i]);//
//	}//
	for(int j=1;j<=r;j++){
		int tt=1;
		for(int i=1;i<=2*n;i+=2){
			if(w[per[i].num]>w[per[i+1].num]){
				win[tt].num=per[i].num;
				win[tt].s=per[i].s+1;
				lose[tt].num=per[i+1].num;
				lose[tt].s=per[i+1].s;
			}else{
				win[tt].num=per[i+1].num;
				win[tt].s=++per[i+1].s;
				lose[tt].num=per[i].num;
				lose[tt].s=per[i].s;
			}
			tt++;
		}
		MyLittlePony();
//		for(int i=1;i<=2*n;i++){//
//			printf("%d:%d %d %d\n",j,per[i].num,per[i].s,w[per[i].num]);//
//		}//
	}
	printf("%d",per[q].num);
	return 0;
}
第二个点庞大的数据量让我无从下手TAT 调了一个星期了(痛哭流涕)

回复

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

正在加载回复...