这题记得上一学期也做过一次,今天又做了一次,终于弄懂了orz,感觉这是个很牛逼的贪心。
简单地说就是耍无赖,能赢就赢最有价值的,要输就输你最厉害的。
情况分为7种:
1:我最快的比你最快的还快,直接赢下。
2:我最快的比你最快的慢,拿我最慢的输你最快的。
3:我最慢的比你最慢的快
,直接赢下。
4:我最慢的比你最慢的慢,
拿我最慢的输你最快的。
5:我最快的和你最快的一样,这时比较两个最慢的,如果
我最慢的比你最慢的快
,直接赢下,如果我最慢的比你最慢的慢,拿 我最慢的输你最快的。
6:我最慢的和你最慢的一样,这时比较两个最快的,如果我最快的比你最快的快,直接赢下,如果我最快的比你最快的慢,拿 我最慢的输你最快的。
7:我们最快最慢都相等时,直接拿我最慢的和你最快的比(注意:这里不一定会输,因为有所有马的速度都相等的情况,如, 全都是20,同时我留下了一只最优秀的马,你留下了一只最辣鸡的马,为后面的逆转提供可能)
补充:如果想要去找到中间某只会输掉的马,然后代替它输掉,这个方法我没试过,不过我觉得因为不是第一个和第一个这样 按顺序地比,所以根本不知道中间的那匹马会和谁比,会不会输掉,因此应该不用考虑。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int t[1001],q[1001];
int n;
bool cmp(int x,int y)
{
return x>y;
}
void judge();
int main()
{
while(scanf("%d",&n)==1)
{
if(n==0){break;}
int i;
for(i=0;i<n;i++)
{
scanf("%d",&t[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&q[i]);
}
sort(t,t+n,cmp);//降序排序,把最大的放前面
sort(q,q+n,cmp);
judge();
}
return 0;
}
void judge()
{
int ans=0;
int i,j;
int ti=0,tj=n-1;//指向田鸡的马的队首,队尾
int qi=0,qj=n-1;//指向齐王的马的队首,队尾
while(ti<=tj && qi<=qj)
{
if(t[ti]>q[qi]){ti++;qi++;ans+=200;continue;}
if(t[ti]<q[qi]){tj--;qi++;ans-=200;continue;}
if(t[ti]==q[qi])
{
if(t[tj]<q[qj]){tj--;qi++;ans-=200;continue;}
if(t[tj]>q[qj]){tj--;qj--;ans+=200;continue;}
}
if(t[tj]>q[qj]){tj--;qj--;ans+=200;continue;}
if(t[tj]<q[qj]){tj--;qi++;ans-=200;continue;}
if(t[tj]==q[qj])
{
if(t[ti]<q[qi]){tj--;qi++;ans-=200;continue;}
if(t[ti]>q[qi]){ti++;qi++;ans+=200;continue;}
if(t[ti]==q[qi]){if(t[tj]<q[qi]){ans-=200;}tj--;qi++;continue;}//注意都相等的情况,不一定会输。
}
}
printf("%d\n",ans);
}