田忌赛马,问田忌最多能多赢多少局,赢就+200,输-200,平就是0;
我的思路是将马从大往小排列,然后齐王的马从前往后扫,如果此时比田忌的马慢,就算田忌胜一局,不满足这个条件,就看是否比田忌最慢的马快,如果快就记田忌输一局
但是提交wa了,求解!!!
原帖地址:http://www.niuyq.com/2012/8/4/00458.html
ac源码:
#include<iostream>
#include <algorithm>
using namespace std;
bool cmp(int x,int y)
{
return x>y;
}
int main()
{
int x,n,i,j,k;
n=0;
int a[1005],b[1005];//a 田忌 ; b 国王;
int s;
while( cin>>x&&x)
{
for(i=0;i<x;i++) cin>>a[i];
sort(a,a+x,cmp);
for(i=0;i<x;i++) cin>>b[i];
sort(b,b+x,cmp);
for(i=0;i<x;i++) //去掉国王中比田忌最大的还大的。必输。
if(b[i]<=a[0]) break;
for (s=-200*x;i<x;i++)
{
n=-i*200;
for (j=i,k=0;j<x;j++,k++)//依次一一比较
{
if (a[k]>b[j])
n+=200;
else if (a[k]<b[j])
n-=200;
}
//cout<<n<<endl;
if (n>s)
s=n;
}
cout<<s<<endl;
}
return 0;
}
我自己写的wa源码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
int n,a[1010],b[1010];
while(cin>>n && n)
{
int i,j,k,shu=0,yin=0;//shu表示失败局数,yin表示田忌获胜局数
for(i=0;i<n;i++) cin>>a[i];
for(i=0;i<n;i++) cin>>b[i];
sort(a,a+n,cmp);
sort(b,b+n,cmp);
i=0; j=0; k=n-1;
while(j<n)
{
if(a[i]>b[j]) { yin++; i++; j++;}
else if(b[j]>a[k]) { shu++; j++; k--; }
else j++;
}
cout<<(yin-shu)*200<<endl;
}
return 0;
}