Avatar
“”

一个兴趣使然的追梦人

▼

#题解Codeforces Round 993 (Div. 4)_C. Hard Problem

C. Hard Problem,传送门<-点我

题解:C. Hard Problem

题目大意

教室里共有 \(2\) 排座位,每排恰好有 \(m\) 个座位(总共 \(2m\) 个座位)[cite: 2]。

现在有 \(a + b + c\) 只猴子需要安排就座[cite: 2]:

  • \(a\) 只猴子只愿意坐在第 \(1\) 排[cite: 2];
  • \(b\) 只猴子只愿意坐在第 \(2\) 排[cite: 2];
  • \(c\) 只猴子对排数无偏好(第 \(1\) 排或第 \(2\) 排均可)[cite: 2]。

每个座位最多坐 \(1\) 只猴子[cite: 2]。问:在满足所有就座猴子偏好的前提下,最多可以安排多少只猴子坐下[cite: 2]?


核心思路

典型的贪心策略。

因为猴子 \(a\) 和猴子 \(b\) 有严格的排数偏好,而猴子 \(c\) 没有任何偏好[cite: 2],所以在分配有限的座位时,必须优先满足有强限制的猴子,剩余的空位再留给无偏好的猴子。

具体拆解如下:

1. 优先满足偏好第 1 排的猴子

第 \(1\) 排一共有 \(m\) 个座位[cite: 2]。

  • 能够坐下的第 \(1\) 排猴子数量为:

    \[a_1 = \min(m, a) \]

  • 此时第 \(1\) 排还剩余的空座位数量为:

    \[a_2 = m - a_1 \]

2. 优先满足偏好第 2 排的猴子

第 \(2\) 排一共有 \(m\) 个座位[cite: 2]。

  • 能够坐下的第 \(2\) 排猴子数量为:

    \[b_1 = \min(m, b) \]

  • 此时第 \(2\) 排还剩余的空座位数量为:

    \[b_2 = m - b_1 \]

3. 用无偏好的猴子填充剩余空位

两排各自安排完特定偏好的猴子后,教室里总共还剩下的空位数为:

\[\text{rem} = a_2 + b_2 \]

此时将无偏好的猴子安排到这些空座位中,能坐下的人数为:

\[c' = \min(\text{rem}, c) \]

4. 汇总最终答案

最终最大就座总人数为:

\[\text{Ans} = a_1 + b_1 + c' \]


复杂度分析

  • 时间复杂度:只包含基础的四则运算与取最小值操作,单组测试用例仅需 \(\mathcal{O}(1)\) 常数时间。总共有 \(t \le 10^4\) 组测试用例,总耗时小于 \(10\text{ ms}\),远低于 \(1.0\text{ s}\) 时限[cite: 2]。
  • 空间复杂度:仅使用若干标量变量存储输入与计算结果,空间复杂度为 \(\mathcal{O}(1)\)[cite: 2]。

C++ 代码实现

#include <iostream>
#include <algorithm>

using namespace std;

void solve() {
    int m, a, b, c;
    cin >> m >> a >> b >> c;

    // 1. 安排第 1 排
    int a1 = min(m, a);
    int a2 = m - a1;

    // 2. 安排第 2 排
    int b1 = min(m, b);
    int b2 = m - b1;

    // 3. 统计两排剩余的空位,优先填入无偏好的猴子 c
    int cp = a2 + b2;
    int cpp = min(cp, c);

    // 4. 输出就座总数
    cout << a1 + b1 + cpp << "\n";
}

int main() {
    // 快速 IO
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    if (cin >> t) {
        while (t--) {
            solve();
        }
    }
    return 0;
}
posted @ 2026-09-28 15:12  hermanO  阅读(3)  评论(0)    收藏  举报