你要和田忌赛马。你们各自有 𝑁N 匹马,并且要进行 𝑁N 轮比赛,每轮比赛,你们都要各派出一匹马决出胜负。
你的马匹的速度分别为 u1,u2,⋯,un,田忌的马匹的速度分别为 v1,v2,⋯,vn。田忌会按顺序派出他的马匹,请问你要如何排兵布阵,才能赢得最多轮次的比赛?巧合的是,你和田忌的所有马匹的速度两两不同,因此不可能出现平局。
第一行一个整数 N。保证 1≤N≤5×10^4
接下来一行 𝑁N 个用空格隔开的整数,依次为 u1,u2,⋯,un,表示你的马匹们的速度。保证 1≤ui≤2N。
接下来一行 𝑁N 个用空格隔开的整数,依次为 v1,v2,⋯,vn,表示田忌的马匹们的速度。保证 1≤vi≤2N。
输出一行,表示你最多能获胜几轮。
输入 #1复制
3 1 3 5 2 4 6
输出 #1复制
2
输入 #2复制
5 10 3 5 8 7 4 6 1 2 9
输出 #2复制
5
样例解释 1
第 1 轮,田忌派出速度为 2 的马匹,你可以派出速度为 3 的马匹迎战,本轮你获胜。
第 2 轮,田忌派出速度为 4 的马匹,你可以派出速度为 5 的马匹迎战,本轮你获胜。
第 3 轮,田忌派出速度为 6 的马匹,你可以派出速度为 1 的马匹迎战,本轮田忌获胜。
如此,你可以赢得 2 轮比赛。
- #include
- #include
- #include
- using namespace std;
-
- int main() {
- // 读取输入的比赛的马匹数量
- int n;
- cin >> n;
-
- // 分别保存你和田忌的马匹的速度
- vector<int> you(n);
- vector<int> tian(n);
-
- // 读取你的马匹的速度
- for (int i = 0; i < n; ++i) {
- cin >> you[i];
- }
-
- // 读取田忌的马匹的速度
- for (int i = 0; i < n; ++i) {
- cin >> tian[i];
- }
-
- // 排序你和田忌的马匹的速度
- sort(you.begin(), you.end());
- sort(tian.begin(), tian.end());
-
- // 使用贪心算法计算你可以赢得的最多比赛轮数
- int cnt = 0;
- int j = 0;
- for (int i = 0; i < n; ++i) {
- if (you[i] > tian[j]) {
- ++cnt;
- ++j;
- }
- }
-
- // 输出结果
- cout << cnt << endl;
-
- return 0;
- }