专栏文章

题解:AT_abc431_c [ABC431C] Robot Factory

AT_abc431_c题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@min6c3to
此快照首次捕获于
2025/12/01 21:17
3 个月前
此快照最后确认于
2025/12/01 21:17
3 个月前
查看原文

说在前面

前置芝士:双指针、排序、贪心。

题目分析

既然要判断满足满足条件,那么就要使得能被组成的机器人最多,我们必须拿最小的头去组装最小的合法的身子,这样一定是最优的。为什么呢?假设你拿最小的头去组装大的身子,那后面来了一个更大的头,你就没办法组装了,答案一定不会更优。
我们先排序:然后这个过程使用双指针实现:
  • 假设现在我们要匹配的头是 ii,目前在第 jj 个身体;
  • 我们不断地移动 jj,直到能组成机器人,就把计数器加一;
  • ii 加一,jj 加一。重复这个过程,直到 i>ni > n 或者 j>mj > m
什么!你问我为什么这样做是对的?(用手) 是因为我们的重量(HiH _ {i}BiB _ {i})均为单调不减,你往后走会越来越小,所以我们的 jj 指针始终只往前移。
时间复杂度 O(m)O(m)
什么!你又问我为什么不是 O(nm)O(nm)?考虑到 jj 只往前移,最多从 11mm,也就是说,假设对于每个 iijj 往前移 xix _ i 位,那么时间复杂度最多是 i=1nxim\sum _ {i = 1} ^ {n} x _ i \le mii 的作用相当于 \sum

注意事项:

每次找到匹配的以后 jj 需要加一,因为一个不能重复用。

赛时代码

CPP
#include <bits/stdc++.h>

#define int long long

using namespace std;

namespace zcq_qwq {
    const int N = 2e5 + 5;

    int n, m, k;

    int a[N], b[N];

    void main() {
        cin >> n >> m >> k;
        for (int i = 1; i <= n; i++) {
            cin >> a[i];
        }
        for (int i = 1; i <= m; i++) {
            cin >> b[i];
        }
        sort(a + 1, a + n + 1);
        sort(b + 1, b + m + 1);
        // cout << n << " " << m << endl;
        int l = 1, r = 1, ans = 0;
        while (l <= n) {
            while (r <= m && b[r] < a[l]) {
                r++;
            }
            if (r > m) {
                break;
            }
            ans++;
            r++;
            l++;
        }
        // cout << ans << endl;
        if (ans < k) {
            cout << "No";
        } else {
            cout << "Yes";
        }
    }
}

signed main() {
    zcq_qwq::main();
    return 0;
}

说在后面

若代码、思路讲解有误,欢迎提出。

评论

0 条评论,欢迎与作者交流。

正在加载评论...