《B3928 [GESP202312 四级] 田忌赛马》

发布时间:2026/6/9 18:26:21
《B3928 [GESP202312 四级] 田忌赛马》
题目背景对应的选择、判断题试题 - GESP 202312 C 四级 - 洛谷有题题目描述你要和田忌赛马。你们各自有 N 匹马并且要进行 N 轮比赛每轮比赛你们都要各派出一匹马决出胜负。你的马匹的速度分别为 u1​,u2​,⋯un​田忌的马匹的速度分别为 v1​,v2​,⋯,vn​。田忌会按顺序派出他的马匹请问你要如何排兵布阵才能赢得最多轮次的比赛巧合的是你和田忌的所有马匹的速度两两不同因此不可能出现平局。输入格式第一行一个整数 N。保证 1≤N≤5×104接下来一行 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 iostream #include vector #include set using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin n; vectorint u(n), v(n); multisetint us; for (int i 0; i n; i) { cin u[i]; us.insert(u[i]); } for (int i 0; i n; i) { cin v[i]; } int ans 0; for (int x : v) { auto it us.upper_bound(x); if (it ! us.end()) { ans; us.erase(it); } else { us.erase(us.begin()); } } cout ans endl; return 0; }