HDU 1052 田忌赛马(贪心)

这题记得上一学期也做过一次,今天又做了一次,终于弄懂了orz,感觉这是个很牛逼的贪心。

简单地说就是耍无赖,能赢就赢最有价值的,要输就输你最厉害的。
情况分为7种:
1:我最快的比你最快的还快,直接赢下。
2:我最快的比你最快的慢,拿我最慢的输你最快的。
3:我最慢的比你最慢的快 ,直接赢下
4:我最慢的比你最慢的慢, 拿我最慢的输你最快的。
5:我最快的和你最快的一样,这时比较两个最慢的,如果 我最慢的比你最慢的快 ,直接赢下,如果我最慢的比你最慢的慢,拿        我最慢的输你最快的。
6:我最慢的和你最慢的一样,这时比较两个最快的,如果我最快的比你最快的快,直接赢下,如果我最快的比你最快的慢,拿        我最慢的输你最快的。
7:我们最快最慢都相等时,直接拿我最慢的和你最快的比(注意:这里不一定会输,因为有所有马的速度都相等的情况,如,        全都是20,同时我留下了一只最优秀的马,你留下了一只最辣鸡的马,为后面的逆转提供可能)
     补充:如果想要去找到中间某只会输掉的马,然后代替它输掉,这个方法我没试过,不过我觉得因为不是第一个和第一个这样      按顺序地比,所以根本不知道中间的那匹马会和谁比,会不会输掉,因此应该不用考虑。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t[1001],q[1001];	
int n;
bool cmp(int x,int y)
{
	return x>y;
}
void judge();
int main()
{
	while(scanf("%d",&n)==1)
	{
		if(n==0){break;}
		int i;
		for(i=0;i<n;i++)
		{
			scanf("%d",&t[i]);
		}
		for(i=0;i<n;i++)
		{
			scanf("%d",&q[i]);
		}
		sort(t,t+n,cmp);//降序排序,把最大的放前面
		sort(q,q+n,cmp);
		judge();
	}
	return 0;
}
void judge()
{
	int ans=0;
	int i,j;
	int ti=0,tj=n-1;//指向田鸡的马的队首,队尾
	int qi=0,qj=n-1;//指向齐王的马的队首,队尾
	while(ti<=tj && qi<=qj)
	{
		
		if(t[ti]>q[qi]){ti++;qi++;ans+=200;continue;}
		if(t[ti]<q[qi]){tj--;qi++;ans-=200;continue;}
		if(t[ti]==q[qi])
		{
			if(t[tj]<q[qj]){tj--;qi++;ans-=200;continue;}
			if(t[tj]>q[qj]){tj--;qj--;ans+=200;continue;}
		}
		if(t[tj]>q[qj]){tj--;qj--;ans+=200;continue;}
		if(t[tj]<q[qj]){tj--;qi++;ans-=200;continue;}
		if(t[tj]==q[qj])
		{
			if(t[ti]<q[qi]){tj--;qi++;ans-=200;continue;}
			if(t[ti]>q[qi]){ti++;qi++;ans+=200;continue;}
			if(t[ti]==q[qi]){if(t[tj]<q[qi]){ans-=200;}tj--;qi++;continue;}//注意都相等的情况,不一定会输。
		}
	}
	printf("%d\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_30684235/article/details/79713224