题目描述 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