小记:这题开始时没认真思考清楚,所以不晓得怎么动笔,感觉可以用稳定婚姻用KM算法去解决。不过那样会稍微麻烦点。而这题一看就是贪心。
思路:这题明显是道贪心题,目的就是在于你要思考清楚它的所有状况,然后采取最优的决策,这样你的结果才是最优的,也就是正确的答案。
首先能力值都排个序。我们可以很快的知道田忌的最快和最慢的马,齐王的也是。
这题想来要是思考过的,都会知道,贪心的关键在于等于的情况处理起来比较复杂,而这也是解决这道题的关键。
首先看田忌和齐王的能比的马中拿两者最快的马来比较,会有3种情况:
1、田忌最快的马比齐王最快的马快,那么就和齐王比。我们可以赢200
2、田忌最快的马比齐王最快的马慢,那么我们就拿田忌最慢的马和齐王最快的马去比,对!是去比,要有结果,这里可能会和齐王最快的马一样快,所以得比。
3、两者最快的马速度相同,那么我们就去看两者最慢的马的比较,当然总的来算也是有三种情况的:
3.1、田忌最慢的马比齐王最慢的马快,那么就和齐王比。我们赢200
3.2、田忌最慢的马比齐王最慢的马快,我们拿田忌最慢的马去和齐王最快的马去比!
3.3、两者最慢的马速度也相等,那么我们照样拿田忌最慢的马去和齐王最快的马去比,这么做的原因是,我们可以为田忌留下速度快的马,而如果速度相等拼了,那么就亏了
因为齐王速度快的马你可能无法压制了,想通这点就好办了。
代码设置5个参数,记录最快最慢的马的id,还有一个记录答案,即必赢的马的数量。
最后乘以200就欧克了。
代码:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
#define mst(a,b) memset(a,b,sizeof(a))
#define REP(a,b,c) for(int a = b; a < c; ++a)
#define eps 10e-8
const int MAX_ = 10010;
const int N = 100010;
const int INF = 0x7fffffff;
int a[MAX_], b[MAX_];
int main()
{
int T, n, m;
while(~scanf("%d", &n), n){
REP(i, 0, n){
scanf("%d", &a[i]);
}
REP(i, 0, n){
scanf("%d", &b[i]);
}
sort(a, a+n); sort(b, b+n);
int mxt, mxq, mit, miq, ans;
mxt = n-1; mit = 0;
mxq = n-1; miq = 0;
ans = 0;
while(mit <= mxt){
if(a[mxt] > b[mxq]){
ans ++;
mxt--;
mxq --;
}
else if(a[mxt] < b[mxq]){
if(a[mit] < b[mxq]){
--ans;
}
++mit;
--mxq;
}
else if(a[mxt] == b[mxq]){
if(a[mit] > b[miq]){
++ans;
++mit;
++miq;
}
else {
if(a[mit] < b[mxq]){
--ans;
}
++mit;
--mxq;
}
}
}
printf("%d\n", ans*200);
}
return 0;
}