hdoj 1052 Tian Ji -- The Horse Racing【田忌赛马】 【贪心】

2014-06-10 23:34:23》》思路:先按从小到大排序, 然后从最快的开始比(假设i, j 是最慢的一端, flag1, flag2是最快的一端 ),田的最快的大于king的 则比较,如果等于然后判断,有三种情况:

一:大于则比较,二等于在判断田的最慢的是不是比king的最快的慢,三小于则与king的最快的比较;

代码1:

#include<stdio.h>
#include<algorithm>
using std::sort;
int cmp( int a, int b )
{
    if( a < b ) return true;
    return false;
}
int main()
{
    int t[1005], k[1005], n, i, j, c;
    while( scanf( "%d", &n ), n )/*跟nyoj上面的结束条件不一样,其他都一样*/
<span style="white-space:pre">	</span>{
        c = 0;
        for( i = 0; i < n; i ++ )
        scanf( "%d", &t[i] );
        sort( t, t+n, cmp );
        for( i = 0; i < n; i ++ )
        scanf( "%d", &k[i] );
        sort( k, k + n, cmp );
         i= j = 0;
         int flag1= n-1, flag2 = n-1;//flag1是田的 
        while( i <= flag1 )
        {
            if( t[flag1] > k[flag2] )
            {
                ++c;
                --flag1;
                --flag2;
            }
            else if( t[flag1] == k[flag2] )
            {
                if( t[i]>k[j] )
                {
                    ++c;
                    ++i;
                    ++j;
                }
                else if( t[i] == k[j] )
                {
                    if( t[i] < k[flag2] ) --c; //注意这处wa了好几次 
                    ++i;
                    --flag2;
                }
                else if( t[i] < k[j] )
                {
                    --c;
                    ++i;
                    --flag2;
                }
            }
            else
            {
                --c;
                ++i;
                --flag2;
            }
        } 
        printf( "%d\n", c*200 );
    }
}

2014-08-25 23:39:31》》(隔了好久,想起来又做了一遍)思路都差不多,
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#define M 1005
using namespace std; 
int t[M], k[M];
int solve(int n){
	int ti, kj, tflag, kflag;
	int win = 0, los = 0;
	ti = kj = 0;
	tflag = kflag = n-1;
	while(ti <= tflag){
		if(t[ti] > k[kj]){
			++ti; ++kj;
			win ++;
		}
		else if(t[ti] <= k[kj]){
			while(t[tflag] > k[kflag]){
				--tflag; -- kflag;
				++win;
			}
			if(t[tflag] <= k[kflag]){
				if(t[ti] < k[kflag]) ++los;
				++ti; --kflag;
			}
		}
	}
	return win-los;
}
int main(){
	int n, i;
	while(scanf("%d", &n) == 1){
		for(i = 0; i < n; i ++){
			scanf("%d", &t[i]);
		}
		for(i = 0; i < n; i ++){
			scanf("%d", &k[i]);
		}
		sort(t, t+n);
		sort(k, k+n);
		int res = solve(n);
		printf("%d\n", res*200);
	}
	return 0;
}

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1052


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值