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