相关代码:
#include <stdio.h>
#include <string.h>
int str[1010],str1[1010],sum;
void program(int i1,int i2,int i3,int i4)
{
if(i1-i2==0||i3-i4==0)
{
if(str[i1]>str1[i3])
sum++;
else if(str[i1]<str1[i3])
sum--;
return;
}
if(str[i1]>str1[i3]&&str[i2]>str1[i4])
{
sum+=2;
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
else if(str[i1]>str1[i3]&&str[i2]==str1[i4])
{
sum+=1;
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
else if(str[i1]>str1[i3]&&str[i2]<str1[i4])
{
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
else if(str[i1]==str1[i3]&&str[i2]>str1[i4])
{
sum+=1;
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
else if(str[i1]==str1[i3]&&str[i2]==str[i4])
{
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
else if(str[i1]==str1[i3]&&str[i2]<str1[i4])
{
if(str[i1]>str1[i4])
{
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
else
{
sum-=1;
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
}
else if(str[i1]<str1[i3]&&str[i2]>str1[i4])
{
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
else if(str[i1]<str1[i3]&&str[i2]==str1[i4])
{
if(str[i1]>str1[i4])
{
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
else
{
sum-=1;
i1++;i3++;i2--;i4--;
program(i1,i2,i3,i4);
}
}
else
{
sum-=1;
i2--;i3++;
program(i1,i2,i3,i4);
}
return ;
}
int main()
{
int n,i,j,change;
while(scanf("%d",&n)&&n)
{
for(i=0;i<2;i++)
for(j=0;j<n;j++)
{
if(i==0)
scanf("%d",&str[j]);
else
scanf("%d",&str1[j]);
}
for(i=0;i<n;i++)
for(j=n-1;j>i;j--)
{
if(str[j]>str[j-1])
{
change=str[j];
str[j]=str[j-1];
str[j-1]=change;
}
if(str1[j]>str1[j-1])
{
change=str1[j];
str1[j]=str1[j-1];
str1[j-1]=change;
}
}
sum=0;
program(0,n-1,0,n-1);
printf("%d/n",sum*200);
}
return 0;
}
我的大致思路:先将所给的马匹排序,用二个数组存储str[],str1[],然后排序,下标小的马匹速度快,然后再用四个变量i1,i2,i3,i4分别代表二个数组的最小,最大下标,初始化i1=0,i2=n-1,i3=0,i4=n-1;然后比j较str[i1]与str1[i3],str[i2]与str[i4];其中有9种情况,有些情况可以直接处理(按贪心的思路),其中特别的是str[i1]<str[i3]&&str[i2]<str1[i4],每种情况多要递归,最后递归终结条件(i1-i2==0||i3-i4==0)。但递交上去,就直接RE。现在暂时搁在一边,等以后在AC它。