http://acm.hdu.edu.cn/showproblem.php?pid=1052
题目大意:
田忌赛马 田忌赢一场赚200金币 输一场输200金币 求田忌最后能得到的金币最大值
分析:
1、如果田忌跑的最慢的马可以跑赢齐王最慢的马就跑
2、如果跑不赢(输掉) 就用它去换掉齐王最快的马(田忌的这匹最慢的马不可能跑赢齐王任何一匹马了)
3、如果田忌最慢的马和齐王最慢的马跑的一样快 就去比较两人最快的马的情况
4、如果田忌跑的最快的马可以跑赢齐王最快的马就跑
5、如果跑不赢(输掉或平局) 这时就考虑用最慢的马换掉齐王最快的马 这时需要判断一下 因为田忌赛马最慢的马可能和齐王最快的马打平手 如果不能平手就用它换掉齐王的马
两匹马尽量保证不要是平局 因为你打平手的这匹马可能会被你的队友战胜
AC代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int cmp(int a,int b){
return a>b;
}
int main (){
int n;
int a[1005];
int b[1005];
while (scanf("%d",&n)&&n){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for (int i=0;i<n;i++){
scanf ("%d",&a[i]);
}
for (int i=0;i<n;i++){
scanf ("%d",&b[i]);
}
sort(a,a+n,cmp);
sort(b,b+n,cmp);
int money=0;
int l1=0,l2=0,r1=n-1,r2=n-1;
for (int i=0;i<n;i++){
if (a[r1]>b[r2]){// 田忌最慢的马可以赢
money+=200;
r1--;
r2--;
}
else if (a[r1]<b[r2]){// 最慢的马输
money-=200;
r1--;
l2++;
}
else {// 相等
if (a[l1]>b[l2]){// 田忌最快的马可以赢
money+=200;
l1++;
l2++;
}
else if (a[r1]<b[l2]){// 最快的马赢不了 最慢的马打不了平手
money-=200;
r1--;
l2++;
}
}
}
printf ("%d\n",money);
}
return 0;
}