贪心——田忌赛马

例: Tian Ji -- The Horse Racing - POJ 2287 - Virtual Judge (vjudge.net)

题目就是田忌赛马,不过不是3匹而是n匹马,也不是一一对应的比齐王的慢一点,而是输入的。

首先田忌赛马的思想应当用最慢的马拼掉对方最快的马,所以从最慢的马下手,先和对方最慢的马比较,如果快说明己方所有的马都能胜过对方这匹马,此时用最慢的赢当然收益最大,如果慢,此时发挥己方的马的最大价值来拼掉对方最快的马,如果相等,再用己方最快的马和对方最快的马比较,如果快,则己方的快马可以赢下对方所有的马,当前要赢下最强的来最大化收益,如果相等,此时己方的慢马也是打平快马也是打平不妨就用慢马拼掉快马来个一胜一负,如果慢,说明对方的快马可以赢过己方所有的马,当然用最慢的马拼掉来取得最大收益。

总结:

先比较两边的慢马

1、己方最慢的马 > 对方最慢的马             赢下即可

2、己方最慢的马 < 对方最慢的马             拼掉对方最快的马 (此时必输)

3、己方最慢的马 = 对方最慢的马

此时比较快马

3.1、己方最慢的马 > 对方最慢的马           赢下即可

3.2、己方最慢的马 <= 对方最慢的马         用慢马拼掉对方的快马 (此时可能平)

实现

sort(a + 1,a + 1 + n);
sort(b + 1,b + 1 + n);       //b为己方的马
int win = 0, pi = 0;		//总局数为n,计算赢得和平局的剩下就是输的
int al = 1, ar = n;
int bl = 1, br = n;
while(bl <= br)
{
    if(b[bl]>a[al])bl++,al++,win++;		//1
    else if (b[bl]<a[al])bl++,ar--;		//2
    else
    {
        while(b[br]>a[ar])br--,ar--,win++;	//3.1		
        if(a[ar]==b[bl])pi++;			//3.2 用慢马拼掉对方的快马 ,如果也平局
        ar--,bl++;						//3.2 输
    }
}
cout << (win - (n - pi - win)) * 200 << endl;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值