1 条题解
-
0
📝 题目大意
给定 个
S型拼图块和 个c型拼图块。每 个c可以合成 个S。每个Scc组合需要 个S和 个c。求最多能组成多少个Scc组合。💡 解题思路
-
题目分析:核心决策在于——是直接使用已有的
S块,还是用c块合成S。直接使用已有S的成本是 个c(配成一组Scc),而合成S的成本是 个c( 个合成S,再 个配对)。显然,已有S是更"便宜"的资源,应优先消耗。 -
算法推导:
- 第一步(贪心):优先用已有的
S和c直接配对。每个已有S消耗 个c,最多能组成 组。这一步后,要么S耗尽,要么c不足以继续配对。 - 第二步(兜底):若
c仍有剩余而S已耗尽,则剩余的c块可以自给自足:每 个c组成一个Scc( 个合成S, 个配对)。因此还能再增加 组。 - 两步相加即为答案。该贪心策略的正确性基于:已有
S的单位成本严格低于合成S,因此不存在"保留已有S而用c合成S"更优的情况。
- 第一步(贪心):优先用已有的
-
边界与细节:
- 时,完全依赖
c合成,答案是 。 - 很小(如 )时,第一步结果为 ,第二步 也为 ,答案正确为 。
- 数据范围较大(),需使用
long long(int64),否则乘法res * 2可能溢出。
- 时,完全依赖
⏱️ 复杂度分析
- 时间复杂度:仅涉及常数次算术运算和
min操作,。 - 空间复杂度:仅使用几个
long long变量,。
💻 标准代码 (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
- 上传者