2 条题解

  • 0
    @ 2025-7-7 14:47:54
    #include <cstdio>  // 包含标准输入输出库
    using namespace std;
    
    int main() {
        // 定义变量:n表示需要买的铅笔数量
        long long int n; 
        // 定义三种包装的铅笔信息:
        // a1, b1, c1 分别表示三种包装每包的数量
        // a2, b2, c2 分别表示三种包装每包的价格
        long long int a1, a2, b1, b2, c1, c2;
        // as, bs, cs 分别表示购买三种包装所需的总花费
        long long int as, bs, cs;
        // ans 存储最终的最小花费
        long long int ans;
    
        cin >> n;  // 输入需要购买的铅笔数量
        cin >> a1 >> a2;  // 输入第一种包装:每包数量和价格
        cin >> b1 >> b2;  // 输入第二种包装:每包数量和价格
        cin >> c1 >> c2;  // 输入第三种包装:每包数量和价格
    
        // 计算第一种包装的花费
        if (n % a1 == 0) {  // 如果需要的数量正好能被每包数量整除
            as = n / a1 * a2;  // 总花费 = (铅笔总数÷每包数量)×每包价格
        } else {  // 如果不能整除
            as = (n / a1 + 1) * a2;  // 需要多买一包:总花费 = (铅笔总数÷每包数量+1)×每包价格
        }
    
        // 计算第二种包装的花费(逻辑同上)
        if (n % b1 == 0) {
            bs = n / b1 * b2;
        } else {
            bs = (n / b1 + 1) * b2;
        }
    
        // 计算第三种包装的花费(逻辑同上)
        if (n % c1 == 0) {
            cs = n / c1 * c2;
        } else {
            cs = (n / c1 + 1) * c2;
        }
    
        // 比较三种包装的花费,找出最小值
        if (as <= bs && as <= cs) {  // 如果第一种花费是最小的
            ans = as;
        } else if (bs <= as && bs <= cs) {  // 如果第二种花费是最小的
            ans = bs;
        } else {  // 否则第三种花费是最小的
            ans = cs;
        }
    
        cout << ans << endl;  // 输出最小花费
        return 0;
    }
    

    解题思路 计算每种包装需要买多少包:

    如果需要的铅笔数量能被包装数量整除(如需要20支,每包10支),那么直接计算:包数 = 需要数量 ÷ 每包数量

    如果不能整除(如需要25支,每包10支),就要多买一包(买3包),因为不能拆包

    计算每种包装的总花费:

    总花费 = 需要买的包数 × 每包价格

    例如:需要25支铅笔,第一种包装每包10支售价20元:

    需要买3包(25÷10=2.5,向上取整为3包)

    总花费 = 3 × 20 = 60元

    比较三种包装的花费:

    分别计算出三种包装的总花费后

    找出其中最小的那个花费值

    【深基3.例11】[NOIP2016 普及组] 买铅笔

    信息

    ID
    688
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    13
    已通过
    5
    上传者