HDU1052 Tian Ji -- The Horse Racing(贪心)

本文介绍了一种解决田忌赛马问题的算法,通过对比双方马匹速度,采用特定策略来最大化赢取金额。文章详细阐述了不同比赛情况下的处理逻辑,并提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:田忌和齐王赛马,有n匹马,每匹马都有自己的速度,赢了得200,输了负200,平局得0.求田忌最多能赢多少钱。


思路:从双方最慢的马开始比较,有三种情况,

1、田忌的马快。这时候直接比就行了,果断胜场加一。

2、田忌的马慢。这时候怎么都会输,就拿田忌最慢的马和齐王最快的马去比,给别的马创造赢面。

3、平局。最复杂的情况,这时候不能直接按平局处理且看下面三组数据:

4
20 25 35 60

20 30 40 80

这种情况下拿田忌最慢的马输给齐王最快的马可以给别的马争取到赢面。

4
20 35 45 85

20 30 40 80

这种情况下拿田忌最慢的马输给齐王最快的马会使得最后多输一场。

那么如何判断该平局还是该去匹配齐王最快的马呢?直接比较最快的马的速度肯定不行,如下面这个数据:

5
20 25 35 60 85
20 30 40 70 80

这种情况田忌最快的马要比齐王的快,需要拿田忌最慢的马去匹配齐王第二快的马。

得出结论:这种情况下从两者最快的马开始比较,直到找到第一个田忌的马不快于齐王的情况。此时用田忌最慢的马去输给齐王的快马即可。


卡几天终于搞了出来,语言有点乱。


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<stack>
#include<queue>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<string.h>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int maxn = 10005;
int a[1005], b[1005];
int main(){
    int n;
    while(~scanf("%d", &n), n){
        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);
        sort(b, b + n);
        int cnt = 0;
        int l1 = 0, r1 = n - 1;//标记田忌的慢马、快马
        int l2 = 0, r2 = n - 1;//标记齐王的慢马、快马
        while(l1 <= r1){
            if(a[l1] > b[l2]){
                ++cnt;
                ++l1;
                ++l2;
            } else if(a[l1] < b[l2]){
                --cnt;
                ++l1;
                --r2;
            } else {
                while(r1 >= l1 && a[r1] > b[r2]){
                    ++cnt;
                    --r1;
                    --r2;
                }
                if(r1 >= l1){
                    if(a[l1] < b[r2]){
                        --cnt;
                    }
                    ++l1;
                    --r2;
                }
            }
        }
        printf("%d\n", 200 * cnt);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值