0pts求调
查看原帖
0pts求调
1306142
Eddy1341楼主2024/7/26 13:32
#include<iostream>
#include<algorithm>
using namespace std;
int n,r,q;
struct player{
	int num,pts,abil;
}a[int(2e5+5)],win[int(1e5+5)],lose[int(1e5+5)];
bool cmp(player a,player b){
	if(b.pts==a.pts)return a.num<b.num;
	return a.pts>b.pts;
}
int main(){
	scanf("%d%d%d",&n,&r,&q);
	n*=2,q--;//为了便于输入 &对应0下标 
	for(int i=0;i<n;i++){
		scanf("%d",&a[i].pts);
		a[i].num=i+1;
	}
	for(int i=0;i<n;i++){
		scanf("%d",&a[i].abil);
	}
	sort(a,a+n,cmp);
	n/=2;//还原 
	while(r--){
		for(int i=0;i<n;i++){//输赢分组 
			if(a[i*2].abil<a[i*2+1].abil){
				a[i*2+1].pts++;
				win[i]=a[i*2+1],lose[i]=a[i*2];
			}else{
				a[i*2].pts++;
				win[i]=a[i*2],lose[i]=a[i*2+1];
			}
		}
		int lp=0,rp=0,k=0;
		while(lp<n&&rp<n){//归并
            if(cmp(win[rp],lose[lp]))a[k++]=lose[lp++];
            else a[k++]=win[rp++];
        }
        while(lp<n)a[k++]=lose[lp++];
        while(rp<n)a[k++]=win[rp++];
//        for(int i=0;i<n*2;i++){
//        	printf("%d:%d ",a[i].num,a[i].pts);
//		}
//		puts("");
	}
    reverse(a,a+n);//升序变降序
	cout<<a[q].num;
	return 0;
}
2024/7/26 13:32
加载中...