马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
田忌赛马
输入
输入最多包含 50 个测试用例。每种情况都以第一行的正整数 n (n <= 1000) 开头,这是每边的马数。第二行接下来的n个整数是田氏马的速度。然后第三行的下一个n个整数是国王马的速度。输入以一行结尾,该行在最后一个测试用例之后具有单个 0。
输出
对于每个输入案例,输出一行包含单个数字,每赢一场得200银元。这是田机将获得的最大金额,以银元为单位。
示例输入
3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
示例输出
200
0
0
#include "stdio.h"
#include <stdlib.h>
int compare(const void *b, const void *a)
{
return *(int*)a - *(int*)b;
}
int main()
{
int c,i,win,ave,j,temp,tj[1001]={0},gw[1001]={0},k;
while(scanf("%d",&c)&&c!=0)
{
for(i=0;i<c;i++)
{
scanf("%d",&tj[i]);
}
for(i=0;i<c;i++)
{
scanf("%d",&gw[i]);
}
qsort(tj, c, sizeof(int), compare);//田忌的马降序
qsort(gw, c, sizeof(int), compare);//国王的马降序
win=0;//胜场数
ave=0;//平局数
temp=-1; //king的马从temp开始, 之前的马速都大于田忌剩余马中速度最大的
for(i=0;i<c;i++)//遍历田忌的马
{
for(j=temp+1;j<c;j++)//每次必定比掉一场
{
if(tj[i] > gw[j]) //tj的马若遇到比他小的最大值则直接比掉
{
win++;
temp=j;
break;
}
else if(tj[i] == gw[j]) //势均力敌
{
for(k=j+1;k<c;k++)
{
if(tj[i] > gw[k]) break;
}
if(k!=c) //平局之后还有比tj小的马
{
win++;
temp=k;
}
else //平局之后全部等于tj速度最大的马
{
ave++;
temp=j;
}
break;
}
}
if(j==c) //已经比到国王的最慢的马了
{
break;
}
}
printf("%d\n",(2*win-c+ave)*200);//赢的场数-输的场数
}
return 0;
}
不知为何,总有几个测试点过不去,望大佬指点 |