1 条题解

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

    📝 题目大意

    高桥君想买一杯定价为 PP 日元的饮料。他有两个选择:直接支付 PP 日元,或者使用优惠券以 QQ 日元购买饮料,但必须额外从 NN 道菜中选一道菜(价格为 DiD_i)。求他喝到饮料所需的最小总金额。

    💡 解题思路

    1. 题目分析N100N \leq 100,数据范围很小,直接枚举即可。关键在于理解两种购买方式的比较:直接购买价格为 PP,使用优惠券则总花费为 Q+min(Di)Q + \min(D_i)

    2. 算法推导

      • 遍历 NN 个菜品价格,找出最便宜的菜品价格 min_dish_price
      • 两种方案取最小值:ans = min(P, Q + min_dish_price)
      • 样例 2 说明了关键点:当所有菜品都很贵时,直接买更划算(100<50+20000100 < 50 + 20000),所以不能默认使用优惠券一定更优。
    3. 边界与细节

      • 题目保证 Q<PQ < P,所以优惠券的饮料价格本身是更低的,但加上菜品后可能超过 PP
      • DiD_iP,QP, Q 最大均为 10510^5int 类型足够(2×105<2312 \times 10^5 < 2^{31})。

    ⏱️ 复杂度分析

    • 时间复杂度O(N)O(N),只需一次遍历找出最小菜品价格。
    • 空间复杂度O(1)O(1),仅使用常数个变量。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main() {
        int n, p, q;
        cin >> n >> p >> q;
        int min_dish_price = INT_MAX;  // 初始化为极大值,方便取 min
        for (int i = 0; i < n; i++) {
            int d;
            cin >> d;
            min_dish_price = min(min_dish_price, d);  // 找最便宜的菜品
        }
        // 两种方案:直接买 (p) 或用优惠券 (q + 最便宜的菜)
        int ans = min(p, q + min_dish_price);
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

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