原题:http://acm.nyist.net/JudgeOnline/problem.php?pid=364
//这题需要仔细分析:先按速度从小到大排序。 慢----->快,从田忌的马开始遍历,利用最佳方案,匹配王的马,最佳方案如下:
//关键在于 田的慢马M能否击败王的马:
//1.如果M能击败王的马(比如能击败A,B),那就选择击败A,B中最快的。
//2.如果不能击败王的任何一只马(那这只马M注定是平或者输),记住这只田马M,接着找王的快马哪一只不能被田击败,如果有王马C是田的马不能击败的,即这只马C会让田只能平或者输(你想连最快的田忌的马都解决不了,那干脆让最慢的马跟抵消掉他算了),
//比如 田马 1 100 ,王马 10 100 ,或者田马 10 100 ,王马10 100,利用这种方案下来都是不亏的。所以让之前的慢马M跟他抵消
//重复过程,直到田忌所有的马匹配结束
//仔细推敲吧,这题我也很无奈,错了很多次,一开始还专门去学了二分图,结果用二分图解会超时。
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
return a<b;
}
int main()
{
int a[1001];//田忌的马
int b[1001];//王的马
int n;
while(~scanf("%d",&n))
{
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++)
{
scanf("%d",&b[i]);
}
sort(a+1,a+n+1,cmp);
sort(b+1,b+n+1,cmp);
int sum=0;
for(i=1;i<=n;i++)
{
int beat=0;
int beatpos=0;
int pin=0;
int pinpos=0;
int now=a[i];
for(j=1;j<=n;j++)
{
if(b[j]==-1)continue;
if(now>b[j]){
beat=1;
beatpos=j;
}
if(now==b[j]){
pin=1;
pinpos=j;
}
}
if(beat==1){//能打败就打败
sum=sum+200;
b[beatpos]=-1;
}else{//不能打败
int k=n;
int l=n;
int f=1;
for(;k>=1 && f;k--)
{
if(b[k]==-1)continue;
for(;l>=i;l--)
{
if(b[k]>=a[l]){
f=0;
k++;
l--;
break;
}
if(b[k]<a[l]){//田忌的马可以打败这匹马
l--;
break;
}
}
}
if(f==0)//如果找到了王解决不了的快马,让慢马去pk
{
if(a[i]<b[k])
{
sum=sum-200;
}
b[k]=-1;
}
}
}
printf("%d\n",sum);
}
return 0;
}