1 条题解

  • 0
    @ 2026-6-19 10:30:44

    📝 题目大意

    有三种鸡蛋包装盒:6 个装售价 S 日元,8 个装售价 M 日元,12 个装售价 L 日元。每种可买任意数量,求至少买到 N 个鸡蛋所需的最小金额。

    💡 解题思路

    1. 题目分析:N ≤ 100,数据范围极小,可以直接暴力枚举。每种包装盒的单价无单调性(可能买大包装反而更便宜),且允许超买(买的鸡蛋可以多于 N 个),因此不能贪心,需要用枚举或 DP。

    2. 算法推导

      • 枚举 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 次迭代,完全可行。
    3. 边界与细节

      • 允许超买(鸡蛋总数 ≥ N 即可),不需要恰好等于 N。
      • 枚举上界 a≤17, b≤13, c≤9 是安全上界,因为 N 最大为 100。若 N 更大,上界需要按 ceil(N/6) 等比例放大。
      • ans 初始化为充分大的值(如 1e9),确保能被第一次合法方案覆盖。

    ⏱️ 复杂度分析

    • 时间复杂度O((N/6)×(N/8)×(N/12))O((N/6) \times (N/8) \times (N/12)),当 N=100N=100 时约为 O(2520)O(2520),常数极小。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (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
    上传者