G1. Dances (Easy version)

题意:给定长度为n的数组a和b,并且给定一个数字m,有m个数组c,数字c从a复制而来,并且只有C[1]跟a不同,其他全都一样。c[1]表示当前是m中第几个数组。现在要对每个c和b进行操作,问至少操作多少次,可以让每个位置上c[i]<b[i],求出所有的c的答案并进行累加。

思路:简单版本,m = 1,一次遍历a查找b中能满足条件的第一个数即可。

总结:如果是复杂版本,就是先固定2n,求出答案累加,然后再考虑剩下的数字中1m最大能满足到多少,再累加答案即可。
有个坑点,如果是红黑树容器,一定要用自己的lower_bound,类内函数,不要用标准库的std::upper_bound,时间复杂度会退化到O(n)

inline void solve() {
    int n, m;
    cin >> n >> m;

    vector<int> a(n);
    a[0] = 1;
    for (int i = 1; i < n; ++i) {
        cin >> a[i];
    }

    multiset<int> b;
    for (int i = 0; i < n; ++i) {
        int t;
        cin >> t;
        b.insert(t);
    }

    int ans = 0;

    for (int i = 0; i < n; ++i) {
        auto it = b.upper_bound(a[i]);
        if (it == b.end()) {
            ans ++;
        }
        else {
            b.erase(it);
        }
    }

    cout << ans << '\n';
}
posted @ 2025-08-29 14:26  _Yxc  阅读(6)  评论(0)    收藏  举报