您的位置:首页 > 其它

hdu1052 Tian Ji -- The Horse Racing

2014-12-16 17:14 357 查看
刚开始做这道题的时候,考虑不够周全,一直没做出来,然后在看了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;
}





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: