Codeforces Global Round 15 B Running for Gold

B Running for Gold

题目链接

题目大意:

N个运动员,每个运动员有五场比赛记录,如果某个运动员有三场比赛的成绩优于另一个运动员,则说这个运动员优于另一个运动员,如果存在一个运动员优于所有运动员,则认为这个运动员可以获得冠军,要求你输出冠军的编号或者在不存在冠军的时候输出-1 。

题解:

正常思维是将每个运动员与所有运动员都比一次,复杂度是O( n 2 n^2 n2)跑不完 1e5,所以这里我们考虑优化一下:
如果存在一个运动员是冠军,那他和任意一个其他运动员相比的结果都是胜利,所以如果某个运动员只要输了任何一次,那他一定不是冠军,由这点,我们可以把单对单的运动员比赛优化为单对单的擂台赛,输的人不会再和其他运动员比较,这样就可以优化到O( n n n)的复杂度。
在执行完上个步骤之后一定会有一个运动员获得最后的胜利,但是这个运动员不一定就是冠军。这里举个例子,剪刀与石头相比,石头获胜,然后与下一个选手布相比,布获胜,但是不能说布比所有选手都强。
所以在最后我们需要用这唯一一个获胜的运动员去和所有运动员相比,如果他确实能胜过所有人他就能获得冠军,如果不能那就没有冠军(因为每个人都至少输了一次)

MD怎么会有人想这么阴间的思维题

代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
 
 
const int N=2e5+5;
const int inf=0x3f3f3f3f;
struct nod{
	int a,b,c,d,e;
	int i;
};
nod a[N];
bool defe(nod x,nod y)
{
	int scx=0,scy=0;
	if(x.a<y.a) scx++;
	else scy++;
	if(x.b<y.b) scx++;
	else scy++;
	if(x.c<y.c) scx++;
	else scy++;
	if(x.d<y.d) scx++;
	else scy++;
	if(x.e<y.e) scx++;
	else scy++;
	if(scx>=scy) return 1;
	else return 0;
}
int ans[N];
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			cin>>a[i].a>>a[i].b>>a[i].c>>a[i].d>>a[i].e;
			a[i].i=i;
		}
		int win=1;
		int i=1,j=2;
		while(i<=n&&j<=n)
		{
			if(defe(a[i],a[j]))
			{
				win=i;
				j++;
			}else{
				win=j;
				i=j;
				j++;
			}
		}
		
//		if(defe(a[i],a[j])){
//			win=i;
//		}else{
//			win=j;
//		}
		bool ok=1;
		for(int i=1;i<=n;i++)
		{
			if(i==win) continue;
			if(!defe(a[win],a[i]))
			{
				ok=0;
				break;	
			}
		}
		if(ok)
		{
			cout<<win<<endl;
		}else{
			cout<<-1<<endl;
		}
	}
	return 0;
}
参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:深蓝海洋 设计师:CSDN官方博客 返回首页

打赏作者

鬼人明灯

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值