http://acm.hdu.edu.cn/showproblem.php?pid=1052
赢了赚200,输了输200,平了就没钱。
贪心策略:若赢就比,若输就换最弱,若平再贪心。
先对两个组排序, 如果田忌最快的马比齐王最快的马快,直接拼掉;如果田忌最快的马比齐王慢,用田忌最慢的马拼齐王最快的马。
如果田忌最慢的马比齐王最慢的马快,直接拼掉,如果田忌最慢的马比齐王慢,用田忌最慢的马拼齐王最快的马。
如果田忌和齐王最快和最慢的马都相同,用田忌最慢的马拼齐王最快的马。
可证明:田忌最快的马和齐王最快的马相等时拿最慢的马来和齐王最快的马比有最优解。(这个,想一想就会明白的。)
#include <iostream>
#include <algorithm>
using namespace std;
#define N 1005
int tj[N],king[N];
int main(){
#ifndef ONLINE_JUDGE
freopen("1052in.txt","r",stdin);
#endif
int n,i,j,p,q,k;
while (scanf("%d",&n)!=EOF&&n){
for (i=0;i<n;i++)
scanf("%d",&tj[i]);
for (i=0;i<n;i++)
scanf("%d",&king[i]);
sort(tj,tj+n);
sort(king,king+n);
i=p=0;
j=q=n-1;
k=0;
while (i<=j){
if (king[i]<tj[p]){
k++;
i++;
p++;
}
else if (king[i]>tj[p]){
k--;
p++;
j--;
}
else if (king[j]<tj[q]){
k++;
j--;
q--;
}
else if (king[j]>tj[q]){
k--;
j--;
p++;
}
else {
if (king[j]!=tj[p])
k--;
p++;
j--;
}
}
printf("%d\n",k*200);
}
return 0;
}