hdu1052 Tian Ji -- The Horse Racing

       刚开始做这道题的时候,考虑不够周全,一直没做出来,然后在看了discuss与别人的博客有才意识到自己考虑不周全。

      这道田忌赛马问题,是一个涉及贪心算法的题目。虽然还没学贪心算法大笑,但是参考别人的思路后对这道题的解题思路已经较为清晰了,下面就来说一下本题的解题思路吧。

       1、 当然要对马的速度进行一个排序,让田忌与齐王的马都从大到小进行排序(当然你也可以从小到大)

       2、 然后将齐王的马与田忌的进行比较,有以下几种情况:

        (1)田忌最快的马,比齐王最快的马还快,当然这种情况直接就用田忌最快的马来赢齐王的最快的马

        (2)田忌最快的马,比齐王最快的马慢,这种情况用田忌最慢的马去与齐王最快的马比赛,以达到最优解

        (3)田忌最快的马齐王最快的马一样快

            此时,拿最慢的马进行比较:

            如果田忌最慢的马齐王最慢的马速度快,那就直接赢了它。 否则就用田忌最慢的马齐王最快的马进行比较

 这里提供一组数据,这组数据能通过的话基本就能过了:

8

11 9 8 8 8 4 3 2
11 9 8 8 8 4 3 2

(答案800)

 代码如下: 

#include <stdio.h>
#include <stdlib.h>
int tian[1001],king[1001],num[1000];
int cmp(const void*a,const void*b){
    return *(int*)b-*(int*)a;
}

int main()
{
    int n,i,count;
    int front,tail,head,rear;
    while(scanf("%d",&n),n){
        front=head=0,tail=rear=n-1;
        count=0;
        for(i=0;i<n;i++)
            scanf("%d",&tian[i]);
        for(i=0;i<n;i++)
            scanf("%d",&king[i]);
        qsort(tian,n,sizeof(tian[0]),cmp);
        qsort(king,n,sizeof(king[0]),cmp);
        while(front<=rear){
            if(tian[front]>king[head]){
                num[front]=head;
                front++;
                head++;
            }
            else if(tian[front]<king[head]){
                num[rear]=head;
                rear--;
                head++;
            }
            else{
                if(tian[rear]>king[tail]){
                    num[rear]=tail;
                    rear--;
                    tail--;
                }
                else{
                    num[rear]=head;
                    head++;
                    rear--;
                }
            }
        }
        for(i=0;i<n;i++){
            if(tian[i]>king[num[i]])
                count++;
            else if(tian[i]<king[num[i]])
                count--;
        }
        printf("%d\n",200*count);
    }
    return 0;
}


 



你可能感兴趣的:(ACM,贪心算法)