分析
一、当田忌有必赢的马,则消耗国王最优的马;
二、当田忌有必输的马,则消耗国王最优的马;
三、当国王有必输的马,则田忌用最慢马赢(代价最小);
四、当国王有必赢的马,则田忌用最慢马输(保留最大实力);
五、当双方都无必输、必赢的马时,即最快与最快、最慢与最慢都一致时,田忌用最慢马消耗国王最快马是最优的策略。证明:
1、若存在国王的马赢田忌的马,则田忌应用最慢的马;而且这最慢马输时,应消耗国王的最快马;
2、若不存在国王的马赢田忌的马,即田忌的马要么赢、要么平,则:
1)田忌的马速度都相同,策略显然成立;
2)田忌的马至少存在两种速度,虽然多输了一场,但至少也能多赢一场,故题设策略是最优的。
代码
#include <bits/stdc++.h>
using namespace std;
#define MXN 1010
int n, t[MXN], k[MXN];
int main(){
while(scanf("%d", &n)){
if(n == 0) break;
for(int i = 1; i <= n; i++) scanf("%d", t+i);
for(int i = 1; i <= n; i++) scanf("%d", k+i);
sort(t+1, t+n+1, [](int x, int y){ return x > y; });
sort(k+1, k+n+1, [](int x, int y){ return x > y; });
int th = 1, tt = n, kh = 1, kt = n;
int w = 0, d = 0, l = 0;
while(w + d + l < n){
if(t[tt] < k[kt]) kh++, tt--, l++; // 若田的慢马必输时
else if(t[th] > k[kh]) kh++, th++, w++; // 若田的快马必赢时
else if(t[th] < k[kh]) kh++, tt--, l++; // 若王的快马必赢时
else if(t[tt] > k[kt]) tt--, kt--, w++; // 若王的慢马必输时
else{ // 双方都无必输或必赢的马时
if(k[kh] > t[tt]) l++;
else if(k[kh] < t[tt]) w++;
else d++;
kh++, tt--;
}
}
printf("%d\n", (w-l)*200);
}
return 0;
}