题目大意:田忌赛马,具体的内容就不多说了,田忌赢一场得200,输一场扣200,平局不得分,求最大能赢多少
解题思路:田忌赛马的话,先按马的能力进行排序,然后尽心贪心计算,具体贪心如下:
1.如果田忌的最好的马 > king的最好的马,就进行比赛,得200分
2.如果田忌的最好的马 == king的最好的马,就比较一下田忌最差的马和king最差的马
a.如果田忌最差的马 > king最差的马,就让两匹最差的马进行比赛(要找到小于king的马,然后让这匹差马和king的好马比才能达到最优),田忌得200
b.如果田忌最差的马 < king最差的马,让田忌最差的马和king的好马进行比赛,田忌-200
c.如果田忌最差的马 == king最差的马,让田忌最差的马和king的好马进行比赛,田忌得0
3.如果田忌的最好的马 < king的最好的马,用田忌最差的马和king的好马比,田忌-200
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1010
int ji[maxn], king[maxn] , n;
int cmp(const int a, const int b) {
return a > b;
}
int main() {
while(scanf("%d", &n) == 1 && n) {
for(int i = 0; i < n; i++)
scanf("%d",&ji[i]);
for(int i = 0; i < n; i++)
scanf("%d",&king[i]);
sort(ji,ji+n,cmp);
sort(king,king+n,cmp);
int max_ji = 0, max_king = 0;
int min_ji = n - 1, min_king = n - 1;
int ans = 0;
while(n--) {
if(ji[max_ji] > king[max_king]) {
ans++;
max_ji++;
max_king++;
}
else if(ji[max_ji] < king[max_king]) {
ans--;
min_ji--;
max_king++;
}
else {
if(ji[min_ji] > king[min_king]) {
ans++;
min_ji--;
min_king--;
}
else {
if(ji[min_ji] < king[max_king])
ans--;
min_ji--;
max_king++;
}
}
}
printf("%d\n",ans*200);
}
return 0;
}