题目:
田忌赛马的故事众所都知,田忌与国王赛马,赢一场赚200,输一场亏200,平局没有影响。问田忌最大能赚多少
分析:
本题看似简单,但其实却十分复杂。此题,我们要考虑。
分三种大情况,
1.如果田忌的最快的马能赢国王最快的马那就比,
2.如果不能赢那就用田忌最慢的马去消耗国王最强的马,
3.最后一种大情况比较复杂,单独展开来说:如果田忌最快的与国王最快的马速度相等,别急着比快马。先比较田忌最慢的马和国王最慢的马,如果田忌慢马赢的了国王慢马,那就比,如果赢不了那就用这匹慢马去消耗国王的快马,这样田忌的快马就会保留下来。大概就是这样,一直比下去。还有一些细节讲不完,附上几组坑点,如果wa了,自己测试一下。
2 2 3 4
1 2 3 4
--------输出400
1 1 1 1
1 1 1 1
---------输出0
1 3 4 6
1 4 5 6
---------输出200
原文:https://blog.csdn.net/qq_37325947/article/details/76034670
下面的代码为本人书写:
#include"stdio.h"
int main()
{
long long n,a[1001],b[1001],i,j,k,x,y,t;
while(~scanf("%lld",&n))
{
x=0;
y=0;
if(n==0)
break;
for(i=0; i<n; i++)
{
scanf("%lld",&a[i]);
}
for(i=0; i<n-1; i++)
for(j=i; j<n; j++)
{
if(a[i]<a[j])
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
for(i=0; i<n; i++)
{
scanf("%lld",&b[i]);
}
for(i=0; i<n-1; i++)
for(j=i; j<n; j++)
{
if(b[i]<b[j])
{
t=b[i];
b[i]=b[j];
b[j]=t;
}
}
i=0;//从此开始为核心语句。
for(j=0; j<n; j++)
{
if(a[i]<b[j])//第一个相比,小直接把后面的移到前面来
{
t=a[n-1];
for(k=n-2; k>=i; k--)
a[k+1]=a[k];
a[i]=t;
if(a[i]<b[j])
y++;
i++;
}
else
{
if(a[i]==b[j])//相等,就最后一匹马。
{
if(a[n-1]>b[n-1])//最后一匹马,田忌快
{
x++;n--;j--;/*这里的j和n都要减1.因为最后一匹马比了,就不需要循环到n-1了。j减1是因为国王的第j匹马还没比的,如果不减,那么循环中的表达式3会加1.导致未能够比j;*/
continue;
}
else//最后一匹马,国王快,那么把最后一匹马跟国王的第i匹马相比。
{
t=a[n-1];
for(k=n-2; k>=i; k--)
a[k+1]=a[k];
a[i]=t;
if(a[i]<b[j])
y++;
i++;
}
}
else
{
x++;
i++;
}
}
}
printf("%lld\n",x*200-y*200);
}
}