田忌赛马

来源:互联网 发布:淘宝借贷利息 编辑:程序博客网 时间:2024/05/16 00:30

Description

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

Input

本题有多组测试数据,整个测试以数字零代表结束.
每组数据的第一行给出数字N,代表有多少匹马
第二行,给出田忌的每匹马的速度
第三行,则给出齐王的.

Output

输出田相最多可以赚到多少钱.

Sample Input

392 83 7195 87 740

Sample Output

200

这道题是一道贪心的题目,只要你看过田忌赛马的故事,就很容易想到这道题大致的贪心路线,事实确实是这样。

现在列举一下

1、如果田忌的最慢的马要比齐王最慢的马快,先赢一场,这是肯定的。

2、如果田忌的最慢的马要比齐王最慢的马慢,就输给齐王最快的马,反正都是要输。

3、如果田忌的最快的马要比齐王最快的马慢,就拿田忌最慢的马去输。

4、如果田忌最快的马要比齐王最快的马快,就赢一场,这样的话价值最大,因为田忌最快的马要比齐王最快的都要快,就必定能赢一场,不如解决齐王实力最强的马。

看起来就只有这么多,然而是有例外的

那就是当最慢的马或是最快的马相等的时候,这个就不列举了,因为也是上面的处理方式,具体参考代码

代码:

#include<bits/stdc++.h>using namespace std;int h1,h2,t1,t2,n,i,ans=0;int t[100001],k[100001];int cmp(int a,int b){    return a>b;}int main(){    while(cin>>n&&n)    {        for(i=1;i<=n;i++)cin>>t[i];        for(i=1;i<=n;i++)cin>>k[i];        sort(t+1,t+n+1,cmp);        sort(k+1,k+n+1,cmp);        h1=h2=1;        t1=t2=n;        while(h1<=t1)        {            if(t[h1]>k[h2])            ans+=200,h1++,h2++;            else            {                if(t[h1]<k[h2])                ans-=200,t1--,h2++;                else                {                    if(t[t1]>k[t2])                    ans+=200,t1--,t2--;                    else                    {                        if(t[t1]<k[h2])                        ans-=200;                        t1--,h2++;                    }                }            }        }        cout<<ans<<endl;        ans=0;    }}


原创粉丝点击