uva 1344 Tian Ji -- The Horse Racing

链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4090


思路:

分别把田忌和国王的马按速度从小到达排序,然后开始从第一个比较,也就是田忌中最小的马和国王最小的马比较,速度分别设为s1, s2,如果s1<s2,那么就采取这个策略,因为这样就以最小的代价赢得了一场比较;如果s1>s2,那么反正这匹马都是输,就让这匹马和国王速度最大的马比!这样就以最小的代价却最大地消耗了敌人。


如果s1=s2,要分情况

那么就反过来让两者最好的马比较,设分别为r1, r2,  如果r1<r2, 说明不管怎样r2都会赢一场,所以就让r2和s1比,这样田忌就以最小的代价输了这场必输的比赛!

如果r1 > r2,就让这两个比,因为田忌的r1赢了对方最强的,值了。

如果r1=r2,那么这时s1=s2, r1=r2, 这两场比赛是都是平局。这样就让s1和r2比,这样r2势必也会赢一场回来。但是可能还有其他代价更小的马可以赢s2,所以这样就有机会让r2去赢更强的对手。



代码:

/*
    uva 1344   Tian Ji -- The Horse Racing
     
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<cstring>
using namespace std;

const int MAXN = 1020;
int s1[MAXN], s2[MAXN];

int main(){
    int n;
    while(~scanf("%d", &n) && n){
        for(int i=0; i<n; ++i) scanf("%d",&s1[i]);
        for(int i=0; i<n; ++i) scanf("%d",&s2[i]);

        sort(s1, s1+n);
        sort(s2, s2+n);

        int l1=0, r1=n-1, l2=0, r2=n-1, win=0, lose=0;

        int cas=1;

        while(l1<=r1 && l2<=r2){
            if(s1[l1] < s2[l2]){
                ++l1, --r2;
                ++lose;
            }else if(s1[l1] > s2[l2]){
                ++l1, ++l2;
                ++win; 
            }else{
                if(s1[r1] > s2[r2]){
                    --r1, --r2;
                    ++win;
                }else if(s1[r1] < s2[r2]){
                    ++l1, --r2;
                    ++lose;
                }else{
                    if(s1[l1] < s2[r2]) ++lose;
                    ++l1, --r2;
                }
            }
        }
        printf("%d\n", (win-lose)*200);
    }
    return 0;
}


你可能感兴趣的:(uva 1344 Tian Ji -- The Horse Racing)