codevs2181 田忌赛马

题目描述 Description

中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?

输入描述 Input Description

第一行为一个正整数n ,表示双方马的数量。
第二行有N个整数表示田忌的马的速度。
第三行的N个整数为齐王的马的速度。

输出描述 Output Description

仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。

样例输入 Sample Input

3
92 83 71
95 87 74

样例输出 Sample Output

200

数据范围及提示 Data Size & Hint

n <= 1000

题解 Solution

贪心时要充分利用每一匹马的战斗力,每匹马都尽量战胜对方速度最快的马(也就是实力比较接近,又能取胜),完全无法获胜的马去消耗对方的最高战力。

  • 代码
#include <algorithm>
#include <cstdio>
#include <cstdlib>
using namespace std;

const int Inf = 2147483647;
const int maxn = 1000005;
int n, ans = 0, a[maxn], b[maxn];

inline bool cmd(int a, int b)
{
    return a > b;
}

int main()
{
    scanf("%d", &n);
    for(int i = 1; i <= n; i++)
      scanf("%d", &a[i]);
    for(int i = 1; i <= n; i++)
      scanf("%d", &b[i]);
    sort(&a[1], &a[n + 1], cmd);
    sort(&b[1], &b[n + 1], cmd);
    int l1 = 1, r1 = n, l2 = 1, r2 = n;
    bool flag = true;
    for(int i = 1; i <= n; i++)
      if(a[i] != b[i]) flag = false;
    if(flag) {
      printf("0"); return 0;
    }
    while(l1 <= r1) {
      if(a[l1] > b[l2]) {
        ans += 200;
        l1++; l2++;
      }else if(a[l1] < b[l2]) {
        ans -= 200;
        r1--; l2++;
      }else if(a[l1] == b[l2] && a[r1] > b[r2]) {
        ans += 200;
        r1--; r2--;
      }else if(a[l1] == b[l2] && a[r1] <= b[r2]) {
        if(a[r1] < b[l2]) ans -= 200;
        r1--; l2++;
      }
    }
    if(ans < 0) printf("%d", 0);
    else printf("%d", ans);
    return 0;
}
  • 注意:结果为负数时要输出0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值