题目分析:
这题的题意就是求怎么让田忌赢最多,可以赢负的。
算法是先将两个都排序,然后按1、田忌的快马比齐王的快,直接比掉。2、若快马没有快,拿田忌最慢的和齐王最慢的比较,若快直接比掉。3、若慢马比齐王慢,就拿田忌最慢的和齐王最快的比较。
按这个算法就可以啦!不过有一组很好的测试数据。
4
1 2 4 5
2 3 3 4
注意:1.很好的贪心题
2. 哎,贪心都不会了,可悲呀,原来的思路彻底错了。。。。。
3.注意不要拘泥于一段,,,
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
return x>y;
}
int main()
{
int a[1200],b[1200];
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+n,cmp);
/*for(int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
printf("\n");*/
int h1,h2,t1,t2;
int w=0,l=0;
h1=1,h2=1,t1=n,t2=n;
for(int i=1;i<=n;i++)
{
if(a[h1]>b[h2])
{
w++;
h1++;
h2++;
}
/*else if(a[h1]==b[h2])
{
}*/
else
{
if(a[t1]>b[t2])//最慢的和最慢的比较
{
w++;
t1--;
t2--;
}
else//最慢的和最快的比较a[t1]与b[h2]比较
{
if(a[t1]==b[h2])
;
else
l++;
t1--;
h2++;
}
}
}
printf("%d\n",(w-l)*200);
}//
system("pause");
return 0;
}
/*我这种的思想是,先升序排列,用田最慢的马和齐王最慢的比较,如快 直接比掉;若慢,就和齐王最快的比掉
如相等,看下一对,,,
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int x,int y)
{
return x<y;
}
int main()
{
int a[1200],b[1200];
int vis[1200];
int n;
while(scanf("%d",&n)!=EOF&&n!=0)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
scanf("%d",&b[i]);
sort(a+1,a+1+n,cmp);
sort(b+1,b+1+n,cmp);
/*for(int i=1;i<=n;i++)
printf("%d ",a[i]);
printf("\n");
for(int i=1;i<=n;i++)
printf("%d ",b[i]);
printf("\n");
memset(vis,0,sizeof(vis));
int win=0,l=0,tail=n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(vis[j]==0)
{
if(a[i]>b[j])
{
win++;
vis[j]=1;
}
else
{
/*
if(a[i]<b[tail] && vis[tail]==0)//小于等于就让田输掉。。。是错的
{ //5;1 2 2 4 5 ;2 2 3 3 4
l++;
}
vis[tail]=1;
tail--;
//break;放错位置了
if(a[i]==b[j] && i+1<=n && j+1<=tail && a[i+1]!=b[j+1])//这一局平了
{
vis[j]=1;
break;
}
if(a[i]<b[j]&&vis[tail]==0)//输掉
{
l++;
vis[tail]=1;
tail--;
}
}
break;
}
//printf("w=%d l=%d\n",win,l);
int ans=(win-l)*200;
printf("%d\n",ans);
}
system("pause");
return 0;
}
*/
/*
3
15 12 9
16 13 9
********
5
7 8 9 12 15
7 8 9 13 16
***************
4
1 2 4 5
2 3 3 4
200这组数据很好....
*/
/*
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int a[1005],b[1005];
int i,n,sum,aa,ab,ba,bb;
while(cin>>n&&n)
{
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
cin>>b[i];
sort(a,a+n);
sort(b,b+n);
aa=0;ab=n-1;ba=0;bb=n-1;
sum=0;
for(i=0;i<n;i++)
{
if(a[ab]>b[bb]) {ab--;bb--;sum++;continue;}
if(a[aa]<b[ba]) {aa++;bb--;sum--;continue;}
if(a[aa]>b[ba]) {aa++;ba++;sum++;continue;}
if(a[aa]==b[ba])
{
if(a[aa]<b[bb])
sum--;
else
{
if(a[aa]>b[bb])
sum++;
}
aa++;bb--;
}
}
sum=sum*200;
cout<<sum<<endl;
}
return 0;
}
*/