原题: http://acm.hdu.edu.cn/showproblem.php?pid=1052
//题目内容跟之前nyoj的题是一样的,我又做了一遍加深印象
//题目关键在于找 最优的方案:
// 用田忌最慢的马去尝试消灭王的马
//1.如果能消灭,就消灭,钱+200
//2.如果不能消灭,说明这匹马A只能平或者输,那么就找 除了A,田忌和王之间对应的(从快到慢),看王那匹马B是田忌只能输或者平的,让A去抵消B
// 如果对应的马,田忌都是能赢的,那就无所谓了,如果A能跟王的某只马平,那就平,不能就消除王的任意一匹马。
//注意 每次在抵消的时候,都要再判断当前田忌的马A和 王的马B 两者的大小。
//用田忌最慢的马去尝试消灭王的马
//1.如果能消灭,就消灭,钱+200
//2.如果不能消灭,说明这匹马A只能平或者输,那么就找 除了A,田忌和王之间对应的(从快到慢),看王那匹马B是田忌只能输或者平的,让A去抵消B
// 如果对应的马,田忌都是能赢的,那就无所谓了,如果A能跟王的某只马平,那就平,不能就消除王的任意一匹马。
//注意 每次在抵消的时候,都要再判断当前田忌的马A和 王的马B 两者的大小。
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int cmp(int a,int b)
{
return a<b;
}
int main()
{
int a[1001];
int b[1001];
int n;
scanf("%d",&n);
while(n)
{
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);
int money=0;
for(int i=1;i<=n;i++)//由慢到快,依次遍历田忌的马
{
int now=a[i]; //
int ying=0;
int yingpos=0;
int ping=0;
int pingpos=0;
for(int j=1;j<=n;j++)
{
if(b[j]==-1)continue;
if(now>b[j]){
ying=1;
yingpos=j;
}
if(now==b[j]){
ping=1;
pingpos=j;
}
}
if(ying==1) //能赢就赢
{
b[yingpos]=-1;
money+=200;
}else{
int k=n;
int l=n;
int aim=0;
int flag=1;
for(;k>i && flag;k--) //从快到慢,依次对比王和田忌的马
{
for(;l>=1;l--)
{
if(b[l]==-1)continue;
if(b[l]>=a[k]){
aim=l;//王的这匹马,田忌只会输或平
flag=0;
break;
}else if(b[l]<a[k]){
l--;
break;
}
}
}
if(aim!=0) //找到了田忌解决不了的,平或者输的马b[aim]
{
if(a[i]<b[aim]) //用田忌这匹也是只能输或平的马 去抵消b[aim]
{
money-=200;
}
b[aim]=-1;
}else{ //由高到低,田忌和王对应的马,田忌都能赢
if(ping==1){ //那这匹a[i],能平就平
b[pingpos]=-1;
}else{
l=n;
while(l>=1) //不能平就抵一只最快的(任意,不是最快也行)
{
if(b[l]!=-1){
break;
}
l--;
}
if(a[i]<b[l])
{
money-=200;
}
b[l]=-1;
}
}
}
}
printf("%d\n",money);
scanf("%d",&n);
}
return 0;
}