poj 2287 贪心(田忌赛马)

来源:互联网 发布:在线阅读系统源码 编辑:程序博客网 时间:2024/05/15 05:07

题意:田忌赛马。每匹马给定一个能力值,赢一场赢200元,输一场输200元,平局钱数不变。问收益最大。

思路(http://blog.csdn.net/zhang20072844/article/details/8126344):贪心策略:1,如果田忌的最快马快于齐王的最快马,则两者比。
(因为若是田忌的别的马很可能就赢不了了,所以两者比)
2,如果田忌的最快马慢于齐王的最快马,则用田忌的最慢马和齐王的最快马比。
(由于所有的马都赢不了齐王的最快马,所以用损失最小的,拿最慢的和他比)
3,若相等,则比较田忌的最慢马和齐王的最慢马
3.1,若田忌最慢马快于齐王最慢马,两者比。
(田忌的最慢马既然能赢一个就赢呗,而且齐王的最慢马肯定也得有个和他比,所以选最小的比他快得。)
3.2,其他,则拿田忌的最慢马和齐王的最快马比。
(反正所有的马都比田忌的最慢马快了,所以这匹马必输(这个地方还是不太明白),选贡献最大的,干掉齐王的最快马)


#include <stdio.h>#include <string.h>#include <stdlib.h>#define N 1005int t[N],k[N];int n;int cmp(const void* a,const void* b){    return (*(int*)a) - (*(int*)b);}int main(){    while(scanf("%d",&n) && n){        int res=0,i,ti,ki,tj,kj;        for(i = 1;i<=n;i++)            scanf("%d",&t[i]);        for(i = 1;i<=n;i++)            scanf("%d",&k[i]);        qsort(t+1,n,sizeof(int),cmp);        qsort(k+1,n,sizeof(int),cmp);        ti = ki = 1;//t表示田忌,k表示国王;ij表示游标        tj = kj = n;        while(ti!=tj){            if(t[ti] < k[ki] || t[tj] < k[kj]){                ti++;                kj--;                res -= 200;            }else if(t[tj] > k[kj]){                tj--;                kj--;                res += 200;            }else if(k[ki] < t[ti]){                ti++;                ki++;                res += 200;            }else{                if(t[ti] < k[kj])                    res -= 200;                ti++;                kj--;            }        }        if(t[ti] < k[ki])            res -= 200;        else if(t[ti] > k[ki])            res += 200;        printf("%d\n",res);    }    return 0;}


0 0
原创粉丝点击