你和田忌各有 $N$ 匹马,每匹都有自己的速度。一对一比赛——速度严格大于对方才算赢。
你可以自由安排出场顺序,问最多能赢几场?
那如果我最慢的马连田忌最慢的马都打不过呢?那它对谁都赢不了——索性放弃它(必输一场也认了),把"必输"的损失换给最便宜的马承担。
把两队的马从慢到快排好。
看我还没出战的最慢的马——能不能赢这匹?
战绩 +1,双方各换下一匹马继续。
这匹废马留着也没用,弃掉,换我自己更快的一匹再试。
下面这块就是赛场!点 下一步 一帧一帧看,或者点 自动播放 让算法自己跑;也可以输入自己的数据试试。
| 情况 | 含义 | 动作 |
|---|---|---|
u[i] > v[j] | 我能赢 | 赢 +1 i++, j++, ans++ |
u[i] ≤ v[j] | 我太弱 | 弃用 i++ |
任一支队伍的马用完,比赛就结束了。
#include <iostream>
#include <algorithm>
using namespace std;
int u[50005], v[50005];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) cin >> u[i];
for (int i = 0; i < n; i++) cin >> v[i];
sort(u, u + n); // 我的马从慢到快
sort(v, v + n); // 田忌的马从慢到快
int i = 0, j = 0, ans = 0;
while (i < n && j < n) {
if (u[i] > v[j]) { // 能赢:派出去,两边各换下一匹
ans++;
i++;
j++;
} else { // 赢不了:扔掉这匹废马
i++;
}
}
cout << ans << endl;
return 0;
}
u[i] > v[j],不能写 ≥(平局不算赢)。while (i < n && j < n)。