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 
#include 
#include 
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

你可能感兴趣的:(文章类型——题解)