1 条题解

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

    📝 题目大意

    给定两种购买苹果的方式:支付 XX 日元买 11 个苹果,或支付 YY 日元买 33 个苹果。求恰好获得 NN 个苹果所需的最小金额。

    💡 解题思路

    1. 题目分析:数据范围 N100N \leq 100 非常小,允许直接枚举。约束 XYX \leq Y 表明单次买 33 个的价格至少不低于单次买 11 个的价格,但 YY3X3X 的大小关系不确定(即批量购买可能更便宜也可能更贵)。
    2. 算法推导:枚举购买 33 个苹果的操作次数 kk0kN/30 \leq k \leq \lfloor N/3 \rfloor),则剩余 a=N3ka = N - 3k 个苹果全部用单买方式补齐。总花费为 b=kY+aXb = k \cdot Y + a \cdot X。在所有 kk 中取最小值即可。初始值设为全部单买的情况 ans=NXans = N \cdot X
    3. 边界与细节
      • N<3N < 3 时,循环只执行 k=0k = 0 一次,此时 ans=NXans = N \cdot X,正确。
      • Y>3XY > 3X 时(批量买更贵),最优解就是全单买,枚举也会覆盖。
      • 注意 NN 不一定能被 33 整除,剩余部分用单买补齐。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),实际枚举次数为 N/3+134\lfloor N/3 \rfloor + 1 \leq 34
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int x, y, n;
        cin >> x >> y >> n;
        // 初始化答案为全部单买的情况
        int ans = n * x;
        // 枚举购买 3 个苹果的操作次数 k
        for(int k = 0; k <= n / 3; k++){
            int a = n - 3 * k;          // 剩余用单买补齐的苹果数
            int b = k * y + a * x;      // 当前方案的总花费
            ans = min(ans, b);          // 取最小值
        }
        cout << ans;
        return 0;
    }
    
    • 1

    信息

    ID
    624
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者