1 条题解
-
0
📝 题目大意
有三种鸡蛋包装盒:6 个装售价 S 日元,8 个装售价 M 日元,12 个装售价 L 日元。每种可买任意数量,求至少买到 N 个鸡蛋所需的最小金额。
💡 解题思路
-
题目分析:N ≤ 100,数据范围极小,可以直接暴力枚举。每种包装盒的单价无单调性(可能买大包装反而更便宜),且允许超买(买的鸡蛋可以多于 N 个),因此不能贪心,需要用枚举或 DP。
-
算法推导:
- 枚举 6 个装的数量
a、8 个装的数量b、12 个装的数量c。 - 上界确定:
a最多 17(17×6=102 ≥ 100),b最多 13(13×8=104 ≥ 100),c最多 9(9×12=108 ≥ 100)。当只买单一包装时,这些数量足以覆盖 N 的最大值 100。 - 对于每一组
(a, b, c),若a*6 + b*8 + c*12 >= N,则计算花费cost = a*S + b*M + c*L,用ans记录所有合法方案的最小值。 - 三层循环总计约 18×14×10 = 2520 次迭代,完全可行。
- 枚举 6 个装的数量
-
边界与细节:
- 允许超买(鸡蛋总数 ≥ N 即可),不需要恰好等于 N。
- 枚举上界
a≤17, b≤13, c≤9是安全上界,因为 N 最大为 100。若 N 更大,上界需要按ceil(N/6)等比例放大。 ans初始化为充分大的值(如1e9),确保能被第一次合法方案覆盖。
⏱️ 复杂度分析
- 时间复杂度:,当 时约为 ,常数极小。
- 空间复杂度:,仅使用常数个变量。
💻 标准代码 (C++)
#include <iostream> #include <algorithm> using namespace std; int main() { int N, S, M, L; cin >> N >> S >> M >> L; int ans = 1e9; // 初始化为极大值 // 枚举 6 个装的数量 a,最多 17 盒(17×6=102 ≥ 100) for (int a = 0; a <= 17; a++) { // 枚举 8 个装的数量 b,最多 13 盒(13×8=104 ≥ 100) for (int b = 0; b <= 13; b++) { // 枚举 12 个装的数量 c,最多 9 盒(9×12=108 ≥ 100) for (int c = 0; c <= 9; c++) { // 鸡蛋总数满足要求 if (a * 6 + b * 8 + c * 12 >= N) { int cost = a * S + b * M + c * L; // 计算总花费 ans = min(ans, cost); // 更新最小值 } } } } cout << ans << endl; return 0; } -
- 1
信息
- ID
- 756
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 1
- 已通过
- 1
- 上传者