hdu_tian_Ji_The_hourse_Racing

题目大意大家一定知道,就是田忌赛马的故事。但是解决的方法却很让我头痛。一开始的时候就不知道如何解决势均力敌的情况。参见这个才弄清楚具体的思想是什么。下面是我自己编写的代码。田忌赛马的贪心算法思想如下:
比较最大值
1.田忌的最大值大于国王的最大值时,田忌赢一场
2.田忌的最大值小于国王的最大值时,使用田忌的最小值来和国王的最大值比较
3.田忌的最大值和国王的最大值相等的时候需要分情况讨论,
(1)如果直接比较就会平。
(2)如果使用田忌的最小值和国王的最大值比较,田忌的最大值肯定比国王的其他值大也是平。此时要讨论,如果田忌的最小值大于国王的最小值,而让田忌的最小值和国王的最大值比较会出现一胜一负的情况,但是直接比较两个最小值时出现一胜一平的情况。所以这种情况应该让最小值相互比较。如果田忌的最小值小于等于国王的最小值,那么就用比较他们两。
但是为了赢得获得更大的赢得可能性,我选择使用第二种分析。

#include<iostream>
#include<algorithm>
using namespace std;
int tian[1005];
int king[1005];

bool cmp_value(int a,int b){
     return a<b;
}
int main()
{
    int n;
    while(scanf("%d",&n)&&n!=0){
        for(int i=0;i<n;i++)
        scanf("%d",&tian[i]);
        sort(tian,tian+n,cmp_value);
        for(int i=0;i<n;i++)
        scanf("%d",&king[i]);
        sort(king,king+n,cmp_value);
        int get=0;
        int t_high=n-1;
        int t_low=0;
        int k_high=n-1;
        int k_low=0;
        while(t_low<=t_high){
           if(tian[t_low]>king[k_low])
           {
              get+=200;
              //printf("t=%d k=%d\n",tian[t_low],king[k_low]);
              t_low++;
              k_low++;                     
           }else if(tian[t_low]<king[k_low])
           {
              get-=200;
              //printf("t=%d k=%d\n",tian[t_low],king[k_high]);
              t_low++;
              k_high--;      
           }else{
              if(tian[t_high]>king[k_high])
              {
                 get+=200;
                 //printf("t=%d k=%d\n",tian[t_high],king[k_high]);
                 t_high--;
                 k_high--;                             
              }else
              {
                 if(tian[t_low]<king[k_high])
                    get-=200;
                 //printf("%d %d\n",tian[t_low],king[k_high]);
                 t_low++;
                 k_high--;     
              }
           }
        }
        printf("%d\n",get);
    }
    return 0;
}
//两边同时需要改变的时候就使用两边的游标,同时一定要在想清楚的情况下进行编程,否则不要动。 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值