1 条题解

  • 0
    @ 2026-6-19 10:31:02

    📝 题目大意

    给定 NNS 型拼图块和 MMc 型拼图块。每 22c 可以合成 11S。每个 Scc 组合需要 11S22c。求最多能组成多少个 Scc 组合。

    💡 解题思路

    1. 题目分析:核心决策在于——是直接使用已有的 S 块,还是用 c 块合成 S。直接使用已有 S 的成本是 22c(配成一组 Scc),而合成 S 的成本是 44c22 个合成 S,再 22 个配对)。显然,已有 S 是更"便宜"的资源,应优先消耗。

    2. 算法推导

      • 第一步(贪心):优先用已有的 Sc 直接配对。每个已有 S 消耗 22c,最多能组成 min(N,M/2)\min(N, \lfloor M/2 \rfloor) 组。这一步后,要么 S 耗尽,要么 c 不足以继续配对。
      • 第二步(兜底):若 c 仍有剩余而 S 已耗尽,则剩余的 c 块可以自给自足:每 44c 组成一个 Scc22 个合成 S22 个配对)。因此还能再增加 M/4\lfloor M_{\text{剩}} / 4 \rfloor 组。
      • 两步相加即为答案。该贪心策略的正确性基于:已有 S 的单位成本严格低于合成 S,因此不存在"保留已有 S 而用 c 合成 S"更优的情况。
    3. 边界与细节

      • N=0N=0 时,完全依赖 c 合成,答案是 M/4\lfloor M/4 \rfloor
      • MM 很小(如 M<2M<2)时,第一步结果为 00,第二步 M/4\lfloor M/4 \rfloor 也为 00,答案正确为 00
      • 数据范围较大(N,M1012N, M \leq 10^{12}),需使用 long longint64),否则乘法 res * 2 可能溢出。

    ⏱️ 复杂度分析

    • 时间复杂度:仅涉及常数次算术运算和 min 操作,O(1)O(1)
    • 空间复杂度:仅使用几个 long long 变量,O(1)O(1)

    💻 标准代码 (C++)

    #include <bits/stdc++.h>
    using namespace std;
    using ll = long long;
    using ld = long double;
    int main() {
        ll n, m;
        cin >> n >> m;
        // 第一步:优先使用已有的 S 块,每个消耗 2 个 c 块
        ll res = min(n, m / 2);
        // 减去已消耗的 S 和 c
        n -= res;
        m -= res * 2;
        // 第二步:剩余的 c 块自给自足,每 4 个 c 组成一组 Scc
        res += m / 4;
        cout << res << '\n';
        return 0;
    }
    
    • 1

    信息

    ID
    842
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者