田忌赛马c语言代码实现
1,问题描述
你一定听说过田忌赛马的故事吧?如果3匹马变成n匹(n<=100),齐王仍然让他的马按照优到劣的顺序初赛,田忌可以按任意顺序选择他的赛马出赛。赢一局,田忌可以得到200两银子;输一局,田忌就要输掉200两银子。已知道国王和田忌的所有马的奔跑速度,并且所有马的奔跑速度均不相同,现已经对两人的马分别从快到慢排好序。请设计一个算法,帮助田忌赢得最多的银子。
2,算法分析
1、如果田忌最快的马比齐王最快的马快,则比之
2、如果田忌最快的马比齐王最快的马慢,则用田最慢的马跟齐最快的马比 //这是贪心的第一步
3、如果田忌最快的马的速度与齐威王最快的马速度相等
3.1、如果田忌最慢的比齐威王最慢的快,则比之 。 //这是贪心的第二步
3.2、如果田忌最慢的比齐威王最慢的慢,田忌慢VS齐王快
3.3、田忌最慢的与齐威王最慢的相等,田忌慢VS齐王快
3,代码实现(c语言)
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n,i;
printf("请输入马的数量:");
scanf("%d",&n);
int T[n],Q[n];
printf("请输入田忌%d匹马的速度:",n);
for(i=0; i<n; i++)
{
scanf("%d",&T[i]);
}
printf("请输入齐王%d匹马的速度:",n);
for(i=0; i<n; i++)
{
scanf("%d",&Q[i]);
}
int WinTime=0,LostTime=0,j=0,q=0;
int n1=n-1,n2=n-1,Money=0;
while(1)
{
if(T[n1]>Q[n2])
{
WinTime+=1;
printf("田忌速度为%d的马 VS 齐王速度为%d的马 !",T[n1],Q[n2]);
n1=n1-1;
n2=n2-1;
printf(" 这场田忌赢了!1\n");
Money=Money+200;
}
else if(T[n1]<Q[n2])
{
printf("田忌速度为%d的马 VS 齐王速度为%d的马 !",T[j],Q[n2]);
LostTime+=1;
j=j+1;
n2=n2-1;
printf(" 这场齐王赢了!2\n");
Money=Money-200;
}
else if(T[n1]==Q[n2])
{
if(T[j]>Q[q])
{
WinTime+=1;
printf("田忌速度为%d的马 VS 齐王速度为%d的马 !",T[j],Q[q]);
j++;
q++;
printf(" 这场田忌赢了!3\n");
Money=Money+200;
}
else if(T[j]<=Q[q])
{
LostTime+=1;
printf("田忌速度为%d的马 VS 齐王速度为%d的马 !",T[j],Q[n2]);
j++;
n2--;
printf(" 这场齐王赢了!4\n");
Money=Money-200;
}
}
if((LostTime+WinTime)==n)
{
if(WinTime>n/2)
{
printf("\nYES\n");
}
else
{
printf("\nNO\n");
}
printf("%d",Money);
break;
}
}
return 0;
}
4,注意事项
输入数据的时候,第一行为n(马的个数);第二、三行为田忌和齐王n匹马的速度(从小到大)
如果输入的数据不是升序的,可以自己在加一个排序的函数。