求助,用归并写的,6 7两个TLE了
查看原帖
求助,用归并写的,6 7两个TLE了
470962
鲁殿灵光楼主2021/8/27 18:51
#include<stdio.h>
int a[200005];//排在第i位选手的编号为a[i]
int win[200005];//第i个胜利选手的编号为a[i]
int lose[200005];
int s[200005],w[200005];
int cmp(int a,int b)//判断a是否应该排在b前面 
{
	if(s[a]==s[b])
		return a<b?1:0;
	return s[a]>s[b]?1:0;
}
void merge()
{
	int i=1,j=1;
	a[0]=0;
	while(i<=win[0]&&j<=lose[0])
	{
		if(cmp(win[i],lose[j])==1)
			a[++a[0]]=win[i++];
		else
			a[++a[0]]=lose[j++];
	}
	while(i<=win[0])
		a[++a[0]]=win[i++];
	while(j<=lose[0])
		a[++a[0]]=lose[j++];
}
void quicksort(int l,int r)
{
	if(l>=r)
		return;
	int i=l,j=r;
	int temp=a[l];
	while(i!=j)
	{
		while(i<j&&cmp(temp,a[j])==1)
			j--;
		if(i<j)
		{
			a[i]=a[j];
			i++;
			while(i<j&&cmp(a[i],temp)==1)
				i++;
			if(i<j)
			{
				a[j]=a[i];
				j--;
			}
		}
	}
	a[i]=temp;
	quicksort(l,i-1);
	quicksort(i+1,r);
}
int main()
{
	int n,r,q;
	scanf("%d %d %d",&n,&r,&q);
	n*=2;
	for(int i=1;i<=n;i++)
		a[i]=i;
	for(int i=1;i<=n;i++)
		scanf("%d",&s[i]);
	for(int i=1;i<=n;i++)
		scanf("%d",&w[i]);
	quicksort(1,n);
//	for(int i=1;i<=n;i++)
//		printf("%d",a[i]);
	for(int i=1;i<=r;i++)
	{
		win[0]=0;
		lose[0]=0;
		for(int j=1;j<=n;j+=2)
		{
			if(w[a[j]]>w[a[j+1]])
			{
				s[a[j]]++;
				win[++win[0]]=a[j];
				lose[++lose[0]]=a[j+1];
			}
			else
			{
				s[a[j+1]]++;
				win[++win[0]]=a[j+1];
				lose[++lose[0]]=a[j];
			}
		}
		merge();
	}
	printf("%d",a[q]);
}
2021/8/27 18:51
加载中...