uva1344/ HDU1052:Tian Ji -- The Horse Racing

来源:互联网 发布:label mx 破解软件 编辑:程序博客网 时间:2024/04/26 22:10

摘自http://www.cnblogs.com/anderson0/archive/2011/05/07/2039971.html

先对田忌和国王的马进行排序,我是从小到大排序的。

贪心的策略:

一、当田忌最快的马比国王最快的马快时,用田忌最快的马赢国王最快的马。
二、当田忌最快的马比国王最快的马慢时,用田忌最慢的马输给国王最快的马。
三、当田忌最快的马跟国王最快的马一样快时,分情况。

其实上面这两个很容易就想得到,最难的是相等的时候。因为不可以直接让田忌最快的马跟国王最快的马打平,或者直接用最慢的马去输给国王最快的马。(存在反例)

1、如果选择全部打平,那么对于田忌 1 2 3 4,国王 1 2 3 4 ,这组数据,田忌什么黄金也得不到。但是如果选择 1->4, 4->3, 3->2, 2->1田忌可以得到400两黄金。 (大雄想的)

2、如果选择用最慢的马输掉比赛的话,对于田忌    3 4,国王 1    4 ,这组数据,田忌一胜一负,什么黄金也得不到,但是如果田忌选择 3->1 , 4->4 ,一胜一平,田忌可以得到200两黄金。

所以:对于情况三,我们应该从最慢的马开始考虑了

1、当田忌最慢的马比国王最慢的马快,那么用田忌最慢的马赢国王最慢的马

2、当田忌最慢的马比国王最慢的马慢,那么用田忌最慢的马输给国王最快的马

3、当田忌最慢的马跟国王最慢的马相等的时候,用田忌最慢的马跟国王最快的马比

/*********************************************** * Author: fisty * Created Time: 2015/2/7 17:54:02 * File Name   : uva1344.cpp *********************************************** */#include <iostream>#include <cstring>#include <deque>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <vector>#include <cstdio>#include <bitset>#include <algorithm>using namespace std;#define Debug(x) cout << #x << " " << x <<endl#define Memset(x, a) memset(x, a, sizeof(x))const int INF = 0x3f3f3f3f;typedef long long LL;typedef pair<int, int> P;#define FOR(i, a, b) for(int i = a;i < b; i++)#define MAX_N 1100int n;int Tian[MAX_N];int King[MAX_N];int main() {    //freopen("in.cpp", "r", stdin);    cin.tie(0);    ios::sync_with_stdio(false);    while(cin >> n){           if(!n) break;        FOR(i, 0, n){            cin >> Tian[i];        }        FOR(i, 0, n){            cin >> King[i];        }        sort(Tian, Tian + n);        sort(King, King + n);        int T_max = n-1, K_max = n-1, T_min = 0, K_min = 0;         int ans = 0;        while(T_min <= T_max && K_min <= K_max){           if(Tian[T_max] > King[K_max]){ //当田忌最快的马比齐王最快的马快                T_max--;                K_max--;                ans += 200;           }else if(Tian[T_max] < King[K_max]){ //当田忌最快的马比齐王最快的马慢的时候                //用田忌最慢的马和齐王最快的马比                T_min++;                K_max--;                ans -= 200;           }else{               //当两者相等时               if(Tian[T_min] > King[K_min]){                    //当田忌最慢的马比齐王最慢的马快                    T_min++;                    K_min++;                    ans += 200;               }else if(Tian[T_min] < King[K_min]){                    //当田忌最慢的马比齐王最慢的马慢                    //用最慢的马输给齐王最快的马                    T_min++;                    K_max--;                    ans -= 200;               }else{                     //田忌最慢的马和齐王最慢的马相等                    //用最慢的马和齐王最快的马相比                    if(Tian[T_min] < King[K_max])                        ans -= 200;                    T_min++;                    K_max--;               }           }        }        cout << ans << endl;    }    return 0;}


0 0