欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【贪心】Tian Ji -- The Horse Racing

程序员文章站 2022-03-26 14:05:15
...

田忌赛马的故事应该都知道

每局赢的人可以从失败的人那里拿走200银元

你的任务是 为田忌选择最优的策略赢钱

输入:
每次有3行,
第一行n 代表每个人几匹马
第二行是田忌的马
第三行是国王的马

输入:
最后田忌手里有多少钱

【贪心】Tian Ji -- The Horse Racing

ll t,l,n,m,p,q,sum=0,ans=0;
ll a[maxn],b[maxn];

int main(){
	while(cin>>n,n){
		ans=0;
		for(int i=0;i<n;i++) cin>>a[i];
		for(int i=0;i<n;i++) cin>>b[i];
		sort(a,a+n);
		sort(b,b+n);
		int al=0,ar=n-1;
		int bl=0,br=n-1;
		while(al<=ar&&bl<=br){
			if(a[ar]>b[br]){
				ans+=200;
				ar--,br--;
			}else if(a[ar]<b[br]){
				ans-=200;
				al++,br--;
			}else{
				if(a[al]<b[bl]){
					ans-=200;
					al++,br--;
				}else if(a[al]>b[bl]){
					ans+=200;
					al++,bl++;
				}else{
					if(a[al]<b[br]){
						ans-=200;
						al++,br--;
					}
					else if(a[al]==b[br]) break;
				}
			}
		}

		cout<<ans<<endl;
	}

	return 0;
}

这里要静下心来仔细分析:

先将田忌的马和皇上的马都按照速度从小到大排序一下

如果田忌最快的马比皇上最快的马快,那就两个最快的马比,先赢一局,
同时也把皇上最快的马给耗掉了。

如果田忌最快的马比皇上最快的马慢,那就先让田忌最慢的马和皇上最快的马比,
这样田忌最快的马还是有赢的机会,

如果田忌最快的马和皇上最快的马一样快,那就要进一步考虑了
__ 如果田忌最慢的马比皇上最慢的马慢,那就让田忌最慢的马和皇上最快的马比,
__ 将皇上最快的马耗掉,这样还有赢的机会,

__ 如果田忌最慢的马比皇上最慢的马快,那就让田忌最慢的马和皇上最慢的马比,
__ 这样能先赢一局

__ 如果田忌最慢的马和皇上最慢的马速度一样快,
__ 那就让田忌最慢的马和皇上最快的马比,这样下一次比的时候田忌的赢面更大,如果碰__ 到实在运气不好的时候,田忌最快的马还是比皇帝最慢的马快,还是能保证不输。

可以给个例子 比如田忌的马是 1 2 5, 皇上的马是 1 4
5,当前两者最快和最慢的马都相同,就让田忌最慢的先输给皇上最快的。田忌就还剩下 2,5,而皇上只剩下1,4
。结果你懂得,田忌赢两次,皇上赢一次。而如果 最慢对最慢,最快对最快,两次都平局,田忌只剩下2,皇上剩下4,最后还是皇上赢。

当然如果此时田忌最慢的马和皇上最慢的马也一样快的,即田忌和皇上的剩下的马速度都是一样的,直接break掉就好了。

相关标签: c++