这题的确是有点坑爹,第一次贪心的数据这么恶心,情况也多,这题只要你坚持几点就可以了。
(1)要将田忌的每一匹马发挥最大的功效,对于最快的马,将之于齐威王的马比较,如果快的话,就将两者比较,赢200,否者的话转向(2)
(2)将田忌的最慢的马与齐威王的最慢的马比较,如果快的话,就将两者比较,赢200.如果慢的话也比较只是这时候要输掉200,这时候使用这只(田忌的马)最慢的和齐威王最快的马比较,这就是他的最大的功效——当炮灰,否者(也就是速度相等)转向(3)
(3)将田忌的最慢的马与齐威王的快马比较如果慢的话就输掉200,如果想等的话(有些人会将这一步考虑掉),还是要计较只是这时候不赢不输。
(4)最后一个最重要的原则就是能够不要平局就不要平局,除非万不得已,不然就不要平局。
居于上面四个原则就可以做出来了。下面分别附上从慢马和快马比较的代码:
从快马开始比较:
#include<iostream>
using namespace std;
#include<cstdlib>
int cmp(const void *a,const void *b)
{
return *(int*)b-*(int*)a; //这里是快排他的时间复杂度是(nlogn)
}
int main()
{
int a[1005],b[1005];
int n,i,j,k,t,sum;
while(cin>>n,n)
{
sum=0;
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
cin>>b[i];
qsort(a,n,sizeof(a[0]),cmp);//这是快排的两个函数,他们在于头文件#include<stdlib.h>或者#include<cstdlib>中
qsort(b,n,sizeof(b[0]),cmp);
i=j=0; 这里是快马
k=t=n-1; //这里是慢马
while((i<=k))
{
if(a[i]>b[j]) //快马比较,田忌快马胜,就赢200,
{
sum++;
i++;
j++;
}
else if(a[k]>b[t]) //否则田忌快马输,慢马比较,快就赢200
{
sum++;
k--;
t--;
}
else if(a[k]<b[t]) //否则,则用田忌最慢的马赛王最快的马
{
sum--;
k--;
j++;
}
else if(a[k]==b[t]) //如果慢马速度相等,拒绝平局,
{
if(a[k]<b[j]) //如果慢马比快马慢,就输掉200,很多人在这里不比较就直接输掉200;
{
k--;
sum--;
j++;
}
else if(a[k]==b[j]) //否则就是相等,不输不赢
{
k--;
j++;
sum+=0;
}
}
}
cout<<sum*200<<endl;
}
return 0;
}
这是从慢马开始比较,原理都差不多,下面是复制的一个代码
#include<iostream>
using namespace std;
int cmp(const void *a,const void *b)
{
}
int main(void)
{
}
因为数据百度上很容易搜到,在这里就不在附上数据了
/*
#include<stdio.h>
int main()
{
int n,s,i,j,sub=0,sum=0;
int tfast,tslow,wfast,wslow; //分别代表田的最快马,最慢马,王的最快马,最慢马
int t[1000],w[1000];
while(scanf("%d",&n)&&(n!=0))
{
for(i=0;i<n;i++)
scanf("%d",&t[i]);
for(i=0;i<n;i++)
scanf("%d",&w[i]);
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(t[j]<t[j+1])
{s=t[j];t[j]=t[j+1];t[j+1]=s;}
for(i=0;i<n-1;i++)
for(j=0;j<n-1-i;j++)
if(w[j]<w[j+1])
{s=w[j];w[j]=w[j+1];w[j+1]=s;} //由大到小排序
tfast=0;tslow=n-1;
wfast=0;wslow=n-1; //最快最慢马的初始化
for(i=0;i<n;i++) //分三种情况
{
if(t[tfast]==w[wfast]) //情况1
{
if(t[tslow]>w[wslow]){sub++;tslow--;wslow--;}
else if(t[tslow]<w[wslow]){sub--;tslow--;wfast++;}
else if(t[tslow]==w[wslow])
{
if(t[tslow]<w[wfast]){sub--;tslow--;wfast++;}
else if(t[tslow]==w[wfast]){break;}
}
}
else if(t[tfast]>w[wfast]) //情况2
{sub++;tfast++;wfast++;}
else {sub--;tslow--;wfast++;} //情况3
}
sum=sub*200;
printf("%d\n",sum);
sub=0;sum=0;
}
}
*/