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 
#include 
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;iking[head]){
                num[front]=head;
                front++;
                head++;
            }
            else if(tian[front]king[tail]){
                    num[rear]=tail;
                    rear--;
                    tail--;
                }
                else{
                    num[rear]=head;
                    head++;
                    rear--;
                }
            }
        }
        for(i=0;iking[num[i]])
                count++;
            else if(tian[i]


 



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