田忌赛马

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值