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