http://acm.hdu.edu.cn/showproblem.php?pid=1052
田忌和王各有n匹马,马的速度已知,每一回合输的一方给赢的一方200银币,求田忌应怎样分配马的出场顺序才能使田忌能获得最大的收益?
#pragma warning (disable:4786)
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 1000
int tian[MAX+10]; //田忌的马
int king[MAX+10]; //王的马
//按马的速度从小到大排序
bool cmp( int a, int b ){
return a < b;
}
int main(){
int n,i,count;
while( scanf("%d",&n) && n ){
count = 0;
for( i = 0; i < n; i ++ )
scanf("%d", & tian[i] );
for( i = 0; i < n; i ++ )
scanf("%d", & king[i] );
sort( tian, tian + n, cmp );
sort( king, king + n, cmp );
int s_tian = 0, s_king = 0, t_tian = n-1, t_king = n-1;
while( s_tian <= t_tian){
//若田忌的还未比赛的最慢的马比王的最慢的快,直接秒掉它
if( tian[s_tian] > king[s_king] ){
count ++;
s_tian ++;
s_king ++;
}
else {
//若田忌的还未比赛的最快的马比王的最快的快,直接秒掉它
while( t_tian >= s_tian && tian[t_tian] > king[t_king] ){
count ++;
t_tian --;
t_king --;
}
//若田忌的最慢的马比王的最慢的马慢,则从后往前扫描,找到王的比田忌对应的马快的最快马,用最慢的马与此马比赛
if( t_king >= s_king ){
/不要忘记这一判断条件
if( king[t_king] > tian[s_tian] )
count --;
t_king --;
s_tian ++;
}
}
}
printf("%d\n", count * 200 );
}
return 0;
}