hdu 1052 Tian Ji -- The Horse Racing(贪心)

小记:这题开始时没认真思考清楚,所以不晓得怎么动笔,感觉可以用稳定婚姻用KM算法去解决。不过那样会稍微麻烦点。而这题一看就是贪心。


思路:这题明显是道贪心题,目的就是在于你要思考清楚它的所有状况,然后采取最优的决策,这样你的结果才是最优的,也就是正确的答案。

首先能力值都排个序。我们可以很快的知道田忌的最快和最慢的马,齐王的也是。

这题想来要是思考过的,都会知道,贪心的关键在于等于的情况处理起来比较复杂,而这也是解决这道题的关键。

首先看田忌和齐王的能比的马中拿两者最快的马来比较,会有3种情况:

1、田忌最快的马比齐王最快的马快,那么就和齐王比。我们可以赢200

2、田忌最快的马比齐王最快的马慢,那么我们就拿田忌最慢的马和齐王最快的马去比,对!是去比,要有结果,这里可能会和齐王最快的马一样快,所以得比。

3、两者最快的马速度相同,那么我们就去看两者最慢的马的比较,当然总的来算也是有三种情况的:

3.1、田忌最慢的马比齐王最慢的马快,那么就和齐王比。我们赢200

3.2、田忌最慢的马比齐王最慢的马快,我们拿田忌最慢的马去和齐王最快的马去比!

3.3、两者最慢的马速度也相等,那么我们照样拿田忌最慢的马去和齐王最快的马去比,这么做的原因是,我们可以为田忌留下速度快的马,而如果速度相等拼了,那么就亏了

因为齐王速度快的马你可能无法压制了,想通这点就好办了。

代码设置5个参数,记录最快最慢的马的id,还有一个记录答案,即必赢的马的数量。

最后乘以200就欧克了。


代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>

using namespace std;

#define mst(a,b) memset(a,b,sizeof(a))
#define REP(a,b,c) for(int a = b; a < c; ++a)
#define eps 10e-8

const int MAX_ = 10010;
const int N = 100010;
const int INF = 0x7fffffff;

int a[MAX_], b[MAX_];

int main()
{
    int T, n, m;
    while(~scanf("%d", &n), n){
        REP(i, 0, n){
            scanf("%d", &a[i]);
        }
        REP(i, 0, n){
            scanf("%d", &b[i]);
        }
        sort(a, a+n); sort(b, b+n);

        int mxt, mxq, mit, miq, ans;
        mxt = n-1; mit = 0;
        mxq = n-1; miq = 0;
        ans = 0;
        while(mit <= mxt){
            if(a[mxt] > b[mxq]){
                ans ++;
                mxt--;
                mxq --;
            }
            else if(a[mxt] < b[mxq]){
                if(a[mit] < b[mxq]){
                    --ans;
                }
                ++mit;
                --mxq;
            }
            else if(a[mxt] == b[mxq]){
                if(a[mit] > b[miq]){
                    ++ans;
                    ++mit;
                    ++miq;
                }
                else {
                    if(a[mit] < b[mxq]){
                        --ans;
                    }
                    ++mit;
                    --mxq;
                }
            }
        }
        printf("%d\n", ans*200);
    }
	return 0;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值