HDU1052 Tian Ji -- The Horse Racing(贪心)

来源:互联网 发布:传销金字塔算法 编辑:程序博客网 时间:2024/06/11 01:49

题意:田忌和齐王赛马,有n匹马,每匹马都有自己的速度,赢了得200,输了负200,平局得0.求田忌最多能赢多少钱。


思路:从双方最慢的马开始比较,有三种情况,

1、田忌的马快。这时候直接比就行了,果断胜场加一。

2、田忌的马慢。这时候怎么都会输,就拿田忌最慢的马和齐王最快的马去比,给别的马创造赢面。

3、平局。最复杂的情况,这时候不能直接按平局处理且看下面三组数据:

4
20 25 35 60

20 30 40 80

这种情况下拿田忌最慢的马输给齐王最快的马可以给别的马争取到赢面。

4
20 35 45 85

20 30 40 80

这种情况下拿田忌最慢的马输给齐王最快的马会使得最后多输一场。

那么如何判断该平局还是该去匹配齐王最快的马呢?直接比较最快的马的速度肯定不行,如下面这个数据:

5
20 25 35 60 85
20 30 40 70 80

这种情况田忌最快的马要比齐王的快,需要拿田忌最慢的马去匹配齐王第二快的马。

得出结论:这种情况下从两者最快的马开始比较,直到找到第一个田忌的马不快于齐王的情况。此时用田忌最慢的马去输给齐王的快马即可。


卡几天终于搞了出来,语言有点乱。


#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<stack>#include<queue>#include<vector>#include<map>#include<set>#include<algorithm>#include<string.h>using namespace std;typedef long long ll;const int inf = 0x3f3f3f3f;const int mod = 1000000007;const int maxn = 10005;int a[1005], b[1005];int main(){    int n;    while(~scanf("%d", &n), n){        for(int i = 0; i < n; ++i){            scanf("%d", &a[i]);        }        for(int i = 0; i < n; ++i){            scanf("%d", &b[i]);        }        sort(a, a + n);        sort(b, b + n);        int cnt = 0;        int l1 = 0, r1 = n - 1;//标记田忌的慢马、快马        int l2 = 0, r2 = n - 1;//标记齐王的慢马、快马        while(l1 <= r1){            if(a[l1] > b[l2]){                ++cnt;                ++l1;                ++l2;            } else if(a[l1] < b[l2]){                --cnt;                ++l1;                --r2;            } else {                while(r1 >= l1 && a[r1] > b[r2]){                    ++cnt;                    --r1;                    --r2;                }                if(r1 >= l1){                    if(a[l1] < b[r2]){                        --cnt;                    }                    ++l1;                    --r2;                }            }        }        printf("%d\n", 200 * cnt);    }    return 0;}