#题解Codeforces Round 993 (Div. 4)_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;
}

浙公网安备 33010602011771号