Tyvj P1048 田忌赛马 题解

xiaoxiao2021-02-28  65

像我这种蒟蒻就非常适合做一些辣鸡题,比如一些简单的贪心题,今天偶遇田忌赛马,于是我就非常轻(费)松(力)地搞定了这道题。 题目:

时间: 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; }
转载请注明原文地址: https://www.6miu.com/read-67170.html

最新回复(0)