归并排序,但是只有40分,改了好久
查看原帖
归并排序,但是只有40分,改了好久
495599
CSZD楼主2023/2/27 19:01
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int le,ri,fl;
struct a{
	long long m,s,w;//序号,初始分数,实力 
}k[200010],w[100010],l[100010];
int cmp(a aa,a bb)//快排 
{
	if(aa.s==bb.s)return aa.m<bb.m;
	else return aa.s>bb.s;
}
int main()
{
	int n,r,q;
	cin>>n>>r>>q;
	for(int i=1;i<=n*2;i++)scanf("%lld",&k[i].s);
	for(int i=1;i<=n*2;i++)scanf("%lld",&k[i].w);
	for(int i=1;i<=n*2;i++)k[i].m=i;
	sort(k+1,k+n*2+1,cmp);	
	int ww,ll;
	for(int i=1;i<=r;i++)
	{
	    ww=0,ll=0;
	    for(int j=1;j<=n*2;j+=2)
		{
			if(k[j].w>k[j+1].w)//判断胜负 
			{
				k[j].s++;
				w[++ww]=k[j];
				l[++ll]=k[j+1];
			}
			else 
			{
				k[j+1].s++;
				w[++ww]=k[j+1];
				l[++ll]=k[j];
			}
		} 
		le=1;ri=1;fl=0;
		while(1)//归并排序 
	    {
		    if(w[le].s>=l[ri].s)k[++fl]=w[le++];
	        else k[++fl]=l[ri++];//比较大小 
	        if(le>n||ri>n)
	        {
	        	if(le>n)//越界 
	                for(int p=ri;p<=ll;p++)
						k[++fl]=l[p];
	            else
	                for(int p=le;p<=ww;p++)
					    k[++fl]=w[p];
				break; 
			}
	    }
	}  
	cout<<k[q].m<<endl;                     
	return 0;
}
2023/2/27 19:01
加载中...