POJ 2287 田忌赛马 贪心

田忌赛马

题目描述

中国古代一个有名的故事 ” 田忌赛马” 。 田忌和齐王赛马, 他们各有 n 匹马,依次派出一匹马进行比赛, 每一轮获胜的一方将从输的一方获得200 银币, 平局则不用出钱。其中每匹马只能出场一次,每匹马有一个速度值,在比赛中速度快的马一定会获胜。田忌知道所有马的速度值,且田忌可以安排每轮双方出场的马。问田忌如何安排马的出场顺序,使得最后获得的钱最多?

输入

输入包含若干组数组, 每个数据的第 1 行是一个整数 n (n≤1000),表示齐王和田忌各有 n 匹马, 后面的两行每行有 n 个数,分别表示田忌n 匹马和齐王 n 匹马的速度值。测试数据以 0 结束。

输出

输出有若干行,每行输出对应一组输入。输出是一个整数,表示田忌最多获得的钱数 (损失钱则用负数表示)。

输入输出样例

样例输入 #1

复制

3
92 83 71
95 87 74
2
20 20
20 20
2
20 19
22 18
0
样例输出 #1

复制

200
0
0

 思路:

1.如果田忌最快的马比齐王最快的马要快,两者进行比赛
因为,田忌其它的马不一定比齐王最快的马要快,田忌最厉害的既然能打过齐王最厉害的马,那就比赛,击败他


2.如果田忌最快的马比齐王最快的马要慢,那么齐王的这匹最快的马无论如何都是打不败的,那么就让田忌最弱的马去和齐王这匹最强的马比赛,做到损失最小化。

3.如果田忌最快的马和齐王最快的马一样快,那么就比较他们最慢的马

   3.1 如果田忌最慢的马比齐王最慢的马要快,那么一定要比赛
   3.2 如果田忌最慢的马和齐王最慢的马一样快 ,我们就用田忌的慢马去消耗齐王的快马,田忌的慢马和齐王的快马有两种关系要么两者速度相等要么田忌的慢马比齐王的快马要慢
   3.3如果田忌最慢的马比齐王最慢的马要慢,那反正谁也比不过,就和齐王最快的马去比
 

测试点:

8 1

1 9 8 8 8 4 3 2

11 8 8 8 8 4 3 2

答案:800

3

89 85 81

90 85 81 答案:200

3

2 3 5

3 4 4

答案:0


代码实现:

#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

typedef long long ll;

int n;

const int N=1005;

int a[N];
int b[N];

void solve()
{
    int ans=0;
    int i=1;
    int j=1;
    int max_i=n;
    int max_j=n;
    while(n--)
    {
        if(a[max_i]>b[max_j])//田忌的最快的马比齐王最快的马要快
        {
            max_i--;
            max_j--;
            ans+=200;
        }
        else if(a[max_i]<b[max_j])//田忌最快的马比齐王最慢的马要慢
        {
            i++;
            max_j--;
            ans-=200;
        }
        else if(a[max_i]==b[max_j])//田忌最快的马和齐王最快的马一样快
        {
            if(a[i]>b[j])//田忌最慢的马比齐王最慢的马要快
            {
                i++;
                j++;
                ans+=200;
            }
            else if(a[i]==b[j])//田忌最慢的马和齐王最慢的马一样快,用慢马去消耗快马
            {
                if(a[i]<b[max_j])//田忌的慢马可能和齐王的快马相等或者比齐王的快马要慢
                {
                    ans-=200;
                }
                max_j--;
                i++;
            }
            else if(a[i]<b[j])//田忌最慢的马比齐王最慢的马还要慢,反正谁也比不过,和最快的去比
            {
                max_j--;
                i++;
                ans-=200;
            }
        }
    }
    cout<<ans<<endl;
}

int main()
{
    while(cin>>n && n)
    {
        for(int i=1;i<=n;i++) cin>>a[i];
        for(int i=1;i<=n;i++) cin>>b[i];
        sort(a+1,a+1+n);
        sort(b+1,b+1+n);
        solve();
    }
    return 0;
}

参考文章Poj 2287 田忌赛马解题详解(贪心思想)_田忌赛马 poj-CSDN博客

POJ 2287 田忌赛马 - 知道了呀~ - 博客园

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值