田忌與齊王各有 n 匹馬(n ≤ 1000),速度已知。每場比賽派一匹馬,贏得 +200,平 0,輸 -200。求田忌最大期望收益。
雙方馬速排序後,維護四個指標:
t_slow, t_fast:田忌最慢/最快馬索引k_slow, k_fast:齊王最慢/最快馬索引每輪決策(優先級順序):
t[t_slow] > k[k_slow]:用最慢馬贏對方最慢馬 → ++t_slow; ++k_slow; ans++t[t_fast] > k[k_fast]:用最快馬贏對方最快馬 → --t_fast; --k_fast; ans++t[t_slow] < k[k_fast]:用最慢馬犧牲對方最快馬 → ++t_slow; --k_fast; ans--t[t_slow] < k[k_fast]:同上犧牲++t_slow; --k_fast(不增減分)#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
while (cin >> n && n) {
vector t(n), k(n);
for (int &x : t) cin >> x;
for (int &x : k) cin >> x;
sort(t.begin(), t.end(), greater()); // 降序:索引 0 為最快
sort(k.begin(), k.end(), greater());
int t_slow = n-1, t_fast = 0;
int k_slow = n-1, k_fast = 0;
int score = 0;
while (t_slow >= t_fast) {
if (t[t_slow] > k[k_slow]) { // 最慢贏最慢
++score; ++t_slow; ++k_slow;
} else if (t[t_fast] > k[k_fast]) { // 最快贏最快
++score; --t_fast; --k_fast;
} else {
if (t[t_slow] < k[k_fast]) --score; // 犧牲最慢換最快
++t_slow; --k_fast;
}
}
cout << score * 200 << '\n';
}
return 0;
}
O(n log n)O(n)O(n)| 輸入 | 輸出 |
|---|---|
3 | 200 |
int 足夠(n≤1000,分數範圍 ±200,000)。