田忌赛马(贪心)

描述

中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?

输入

第一行为一个正整数n (n <= 1000) ,表示双方马的数量。
第二行有N个整数表示田忌的马的速度。
第三行的N个整数为齐王的马的速度。

输出

仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。

样例输入

3

92 83 71

95 87 74

样例输出

200


 

这道题让我明白……要学好贪心,首先要有颗“贪心”

解析:

首先,从双方最弱的马开始比较:

  1. 如果田忌的马比齐王的马快,那使这两条马比赛(不赢白不赢)
  2. 如果田忌的马比齐王的马慢,就使田忌的这条最弱的和齐王最强的马比赛(反正都要输,不如输的有价值)

 

然后,如果遇到双方的马一样快的情况:

  肯定怼掉啊,反正不输钱!恭喜你,掉坑了

 

这个时候后面的马先放一放,我们看前面:

  1. 如果田忌最强的马比齐王最强的马快,就使这两只比赛(双方强者的硬怼)
  2. 如果田忌最强的马比齐王最强的马慢,就使田忌目前最弱的把齐王最强的浪掉

这样虽然不能保证不输钱,但结果一定是最优的

 

代码如下:

#include<stdio.h>
#include<algorithm>
using namespace std;
int a[2010],b[2010];
int ans;
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    scanf("%d",&a[i]);
    for(int i=1;i<=n;++i)
    scanf("%d",&b[i]);
    
    sort(a+1,a+1+n);
    sort(b+1,b+1+n);
    
    int ra=n,rb=n,la=1,lb=1;
    while(lb<=rb)
    {
        if(a[la]>b[lb])
        {
            la++,lb++;
            ans++;
        }
        else if(a[la]<b[lb])
        {
            rb--,ans--;
            la++;
        }
        else if(a[la]==b[lb])
        {
            if(a[ra]>b[rb]) 
            {
                ans++;
                ra--,rb--;
            }
            else 
            {
                if(a[la]<b[rb]) ans--;
                la++,rb--;
            }
        }
    }
    printf("%d",ans*200);
    return 0;
}
posted @ 2018-08-01 17:45  qseer  阅读(401)  评论(0编辑  收藏  举报