题意:
田忌要和国王赛马,双方各有n只马,赢一场得200,输一场,失200,平局不给钱;问怎么安排田忌赚最多;
思路:
首先第一步肯定是把双方的马都排序,然后先把最慢的马比一下,如果这马比国王快,直接赢下来,如果比国王慢那就用这匹马输给国王最快的马(反正都要输,尽量消耗他);
但是如果一样快,就要比较最快的那匹马,如果最快的那匹马比较快,也是直接赢下来,然后比较接下去最快的,如果最快的马小于或等于国王的,那就用慢的那匹去输(因为如果直接快对快,慢对慢,那么就是一平一负,用慢对快,就是那一负,但是快的那匹肯定会多赢一场下来,收获是一样的,但是这样做我们留下的一匹快的,对方留下一只慢的,后面可以做更好的安排)(如果快马也等于快马也是一样,把两平,换成一胜一负)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1005;
int tian[N], king[N], n;
int main() {
while(scanf("%d",&n) && n) {
for(int i = 0; i < n; i++){
scanf("%d",&tian[i]);
}
for(int i = 0; i < n; i++){
scanf("%d",&king[i]);
}
sort(tian, tian + n);
sort(king, king + n);
int sum = 0, tf = 0, kf = 0, tb = n - 1, kb = n - 1;
while(tf <= tb) {
if(tian[tf] > king[kf]) {
sum += 200;
tf++;
kf++;
continue;
}
if(tian[tf] < king[kf]) {
sum -= 200;
tf++;
kb--;
continue;
}
if(tian[tf] == king[kf]) {
if(tian[tb] > king[kb]) {
sum += 200;
tb--;
kb--;
continue;
}
if(tian[tb] <= king[kb]) {
if(tian[tf] < king[kb])
sum -= 200;
tf++;
kb--;
continue;
}
}
}
printf("%d\n",sum);
}
}