题目背景

对应的选择、判断题:试题 - 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;
    vector<int> u(n), v(n);
    multiset<int> 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;
}

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐