像我这种蒟蒻就非常适合做一些辣鸡题,比如一些简单的贪心题,今天偶遇田忌赛马,于是我就非常轻(费)松(力)地搞定了这道题。 题目:
时间: 1000ms / 空间: 131072KiB
描述
中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱?输入格式
第一行为一个正整数n (n <= 1000) ,表示双方马的数量。 第二行有N个整数表示田忌的马的速度。 第三行的N个整数为齐王的马的速度。
输出格式
仅有一行,为田忌赛马可能赢得的最多的钱,结果有可能为负。 测试样例1
输入
3 92 83 71 95 87 74
输出
200
分析: 很明显的贪心嘛~~~ 首先,双方的马按速度排序。
考虑己方最弱的马和对方最弱的马的速度关系。如果对方更弱,那么不妨就用这匹马去对对方的那匹马;如果我方更弱,那么不妨用这匹马和对方当前最强的马比赛。(平局稍后再说)
同样地,可以考虑己方最强的马和对方最强的马的关系。
不停地贪心处理,直到双方最强的马相等、最弱的马也相等。
这时,强制让这两局平局发生(划掉),用我方最弱的马输给对方最强的马(显然优于划掉的),其实并不一定输,还要比较一下我方最弱的马是否与对方最强的马的速度相等,如果相等,那就不会输了。 继续处理,直到所有的马都用完。
简单吧?!
代码:
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef double DB; int Max(int a, int b){return a > b ? a : b;} int Min(int a, int b){return a < b ? a : b;} const int MAXN = 1e3 + 15; int a[MAXN], b[MAXN]; inline int read(){ int r = 0, z = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-') z = -1; ch = getchar();} while(ch >= '0' && ch <= '9'){r = r * 10 + ch - '0'; ch = getchar();} return r * z; } bool cmp(int x, int y){return x > y;} void fre(){ freopen(".in", "r", stdin); freopen(".out", "w", stdout); } void init(){ int n = read(), ans = 0; for(int i = 1; i <= n; i ++) a[i] = read(); for(int i = 1; i <= n; i ++) b[i] = read(); sort(a + 1, a + n + 1, cmp); sort(b + 1, b + n + 1, cmp); int h0 = 1, t0 = n, h1 = 1, t1 = n; while(h0 <= t0){ if(a[h0] > b[h1]){ans ++; h0 ++; h1 ++;} else if(a[h0] < b[h1]){ans --; t0 --; h1 ++;} else if(a[t0] > b[t1]){ans ++; t0 --; t1 --;} else if(a[t0] < b[t1]){ans --; t0 --; h1 ++;} else { if(a[t0] < b[h1]){ans --; t0 --; h1 ++;} else if(a[t0] == b[h1]){t0 --; h1 ++;} } } printf("%d\n", ans * 200); } int main(){ // fre(); init(); return 0; }