【贪心】Tian Ji -- The Horse Racing

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

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

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

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

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

在这里插入图片描述

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掉就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值