您的位置:首页 > 其它

POJ-2287-Tian Ji -- The Horse Racing

2014-07-04 16:17 330 查看
题意如下:

田忌和齐威王都有n匹马,然后他们要进行n场比赛,田忌赢一场会获得200金币,输一场会损失200金币,平局的话则不失不得!由于田忌和齐威王的马匹有不同的速度,现要求采用某种高能战术能让田忌获得最多money!



思路:

能赢就赢,实在不能赢,也要为其它马匹赢得一场比赛创造机会,或者跑出平局!

首先分别对田忌和齐威王的马匹根据速度进行排序!

设田忌当前最强马匹的下标为maxt,最弱马匹的下标为mint;

齐威王当前最强马匹的下标为maxq,最弱马匹的下标为minq;

不管哪只马,都只能比赛一场,所以比赛一场,肯定会有下标变化的!



请注意下面情况中的两个字“当前”,这个很重要!

极限情况:1.当前最强比当前最强,田忌若能赢,相应的下标会产生变化;

2.当前最弱比当前最弱,田忌若能赢,相应的下标会产生变化;

3.若田忌在前面的两种情况中都不能获胜(不一定就是输,平局也有可能!),那么就用田忌当前最弱的马匹去和齐威王当前最强的马匹单挑,让其光荣的输掉!



田忌:87 80 50 !

齐王:87 85 50 !

当然,此时可能有一种比较奇葩的情况出现,就是田忌当前最弱的马匹和齐威王当前最强的马匹打成平手啦!那么ans就不用减减了!就这种奇葩情况举个例子:

田忌:87 87 87 !

齐王:87 87 87 !



代码如下:(代码里有一些是测试用的!被我注释掉了的!)



#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
    int n,tian[5203],king[5204];
    while(scanf("%d",&n)!=EOF&&n)
    {
        for(int i=0;i<n;i++)
        scanf("%d",&tian[i]);
        for(int i=0;i<n;i++)
        scanf("%d",&king[i]);
        sort(tian,tian+n);
        sort(king,king+n);
        int maxt=n-1;
        int mint=0;
        int maxk=n-1;
        int mink=0;
        int ans=0;
        while(maxt>=mint)
        {
            //printf("ans=%d\n",ans);
            if(tian[maxt]>king[maxk])
            {//田忌的最强马匹完全能赢过king的最强马匹!
                maxt--;
                maxk--;
                ans++;
            }
            else if(tian[mint]>king[mink])
            {//田忌的最弱马匹完全能赢过king的最弱马匹!
                mint++;
                mink++;
                ans++;
            }
            else
            {//现在的情况是田忌最强和最弱马匹都不能赢..
                //king的最强和最弱马匹!//所以需要以小换大的方法了!
                if(tian[mint]<king[maxk])
                ans--;//这种情况是必然要输一场的了!不然就是平局,ans就不会加加了!
                mint++;
                maxk--;
            }
            //printf("田忌maxt=%d;mint=%d\n",maxt,mint);
            //printf("齐威maxk=%d;mink=%d\n",maxk,mink);
        }
        printf("%d\n",ans*200);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: