C解法

更新中
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

第一行输入是四个整数 a、b、c 和 d,其中:
a:满减券数量,每个满减券能减10元,最大能减 a 次。
b:打折券数量,最多使用 b 次,每次可以打9折。
c:无门槛5元券数量,最多使用 c 次,每次减少5元。
d:商品的数量,接下来会有 d 个商品的价格。
接下来的 d 行输入每个商品的价格。
计算商品的最小花费:

对于每个商品的价格,尝试不同的优惠组合,计算最小的花费:
使用满减券后再使用打折券、无门槛券。
使用打折券后再使用满减券、无门槛券。
使用无门槛券后再使用满减券、打折券。
通过不同的优惠顺序,找到每个商品的最优花费和使用的优惠券数。
输出:

对每个商品,输出最小花费和所使用的优惠券数量。

const readline = require("readline");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
});

const data = [];  // 用于保存所有输入的数据
let a, b, c, d;  // 满减券、打折券、无门槛券的数量以及商品数量

// 监听输入的每一行
rl.on("line", (line) => {
    data.push(line);  // 将输入的每一行保存到数据数组中

    // 解析第一行数据:a, b, c, d
    if (data.length === 1) {
        [a, b, c] = data[0].split(" ").map(Number);  // 使用map转换成整数
    }

    // 解析第二行数据:d
    if (data.length === 2) {
        d = parseInt(data[1]);  // 商品的数量
    }

    // 当接收到商品数量的数据时,开始处理商品价格
    if (d && data.length === d + 2) {
        data.shift();  // 删除第一行(包含优惠券数和商品数量的数据)
        data.shift();  // 删除第二行(包含商品数量的行)

        const prices = data.map(Number);  // 将商品价格列表转换为数字数组

        // 调用getRes函数计算每个商品的最优价格和优惠券使用情况
        getRes(prices, a, b, c);

        data.length = 0;  // 清空数据数组,准备下一轮输入
    }
});

// 计算每个商品的最小花费和使用的优惠券数
function getRes(prices, a, b, c) {
    for (let p of prices) {  // 遍历所有商品的价格
        const res = [];  // 用于存储不同优惠组合后的结果

        // 1. 使用满减券再使用打折券
        const m1 = useM(p, a);
        const mn1 = useN(m1[0], b);  // 使用打折券
        res.push([mn1[0], a + b - (m1[1] + mn1[1])]);  // 记录最终价格和使用的优惠券数

        // 2. 使用满减券再使用无门槛券
        const mk1 = useK(m1[0], c);
        res.push([mk1[0], a + c - (m1[1] + mk1[1])]);

        // 3. 使用打折券再使用满减券
        const n1 = useN(p, b);  // 先应用打折券
        const nm1 = useM(n1[0], a);  // 再应用满减券
        res.push([nm1[0], b + a - (n1[1] + nm1[1])]);

        // 4. 使用打折券再使用无门槛券
        const nk1 = useK(n1[0], c);
        res.push([nk1[0], b + c - (n1[1] + nk1[1])]);

        // 按价格升序排序,如果价格相同,按照使用的优惠券数升序排序
        res.sort((x, y) => (x[0] === y[0] ? x[1] - y[1] : x[0] - y[0]));

        // 输出最优结果
        console.log(res[0].join(" "));
    }
}

// 满减券使用函数:每满100元减10元,最多使用a次
function useM(p, a) {
    const cnt = Math.floor(p / 100);  // 计算可以使用的满减券次数
    const used = Math.min(a, cnt);  // 使用的次数不能超过a

    p -= used * 10;  // 计算应用满减后的价格
    a -= used;  // 更新剩余的满减券数量

    return [p, a];  // 返回应用满减后的价格和剩余的满减券数量
}

// 打折券使用函数:打9折,最多使用b次
function useN(p, b) {
    if (b >= 1) {
        p = Math.floor(p * 0.92);  // 打9折
    }
    return [p, b - 1];  // 返回打折后的价格和剩余的打折券数量
}

// 无门槛5元券使用函数:每5元使用1张券,最多使用c次
function useK(p, c) {
    while (p > 0 && c > 0) {  // 只要价格大于0且还有优惠券
        p -= 5;  // 每次减少5元
        p = Math.max(p, 0);  // 确保价格不为负数
        c--;  // 更新剩余的无门槛券数量
    }
    return [p, c];  // 返回使用后的价格和剩余的无门槛券数量
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144835267"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!