【贪心】Tian Ji -- The Horse Racing
程序员文章站
2022-03-26 14:05:15
...
田忌赛马的故事应该都知道
每局赢的人可以从失败的人那里拿走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掉就好了。