编程基础-----田忌赛马

时间:2021-07-18 20:03:06

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题他能产生整体最优解或者是整体最优解的近似解。


给定齐王与田忌的赛马各n匹怎么排顺序才能让田忌胜率更大呢?


首先对齐王与田忌的赛马分别进行由大到小的排序,分出马的等级来。

开始比赛:
把齐王的最差的马同田忌最差的马比较,结果有三种情况:
1、田忌的马更快:比,田忌加分;
2、齐王的马更快:让田忌的这匹马同齐王最快的马比,输也要拉一个最好的;
3、打成平手,这时再如下比:

齐王最快的马与田忌最快的马比较,还是三种情况:
1)田忌的马快,就让它把齐王最快的马比下去;
2)齐王马快田忌就用刚才打平手的劣马同齐王最好的马比,输也要拉一个最好的;

3)平手则让田忌的最慢的马同齐王最快的马比。


#include<stdio.h>
void qsort(int *a,int l,int r)
{
int x=a[l],i=l,j=r;
if(l>=r)return ;
while(i<j)
{
while(i<j&&a[j]<=x)j--;
a[i]=a[j];
while(i<j&&a[i]>=x)i++;
a[j]=a[i];
}
a[i]=x;
qsort(a,l,i-1);
qsort(a,i+1,r);
}
int main()
{
int n,i,tian[1001],wang[1001],la,lb,ra,rb;
int count;
while(scanf("%d",&n)!=EOF,n)
{
count=0;
for(i=0;i<n;i++)
scanf("%d",&tian[i]);
for(i=0;i<n;i++)
scanf("%d",&wang[i]);
qsort(tian,0,n-1);
qsort(wang,0,n-1);
la=lb=0;ra=rb=n-1;
while(la<=ra)
{
if(tian[ra]<wang[rb]){count--;lb++;ra--;}
else if(tian[ra]>wang[rb]){count++;ra--;rb--;}
else if(tian[la]>wang[lb]){count++;la++;lb++;}
else {if(wang[lb]>tian[ra]){ra--;lb++;count--;}
else {ra--;lb++;}}
}
printf("%d\n",count*200);
}
return 0;
}