poj 2287 贪心(田忌赛马)

题意:田忌赛马。每匹马给定一个能力值,赢一场赢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 1005
int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值