华为OD机试真题 Java 实现【网上商城优惠活动(一)】【2022 Q4 100分】,附详细解题思路

news2025/1/11 18:00:12

在这里插入图片描述

目录

    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、补充说明
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

一、题目描述

某网上商城举办优惠活动,发布了满减、打折、无门槛3种优惠券,分别为:

1.每满100元优惠10元,无使用数限制,如100199元可以使用1张减10元,200299可使用2张减20元,以此类推;
2.92折券,1次限使用1张,如100元,则优惠后为92元;
3.无门槛5元优惠券,无使用数限制,直接减5元。

每次最多使用2种优惠券,2种优惠可以叠加(优惠叠加时以优惠后的价格计算),以购物200元为例,可以先用92折券优惠到184元,再用1张满减券优惠10元,最终价格是174元,也可以用满减券2张优惠20元为180元,再使用92折券优惠到165(165.6向下取整)元,不同使用顺序的优惠价格不同,以最优惠价格为准。在一次购物中,同一类型优惠券使用多张时必须一次性使用,不能分多次拆开穿插使用(不允许先使用1张满减券,再用打折券,再使用一张满减券)。

请设计实现一种解决方法,帮助购物者以最少的优惠券获得最优的优惠价格。优惠后价格越低越好,同等优惠价格,使用的优惠券越少越好,可以允许某次购物不使用优惠券。

优惠活动每人只能参加一次,每个人的优惠券种类和数量是一样的。

二、输入描述

第一行:每个人拥有的优惠券数量(数量取值范围为[0, 10]),按满减、打折、无门槛的顺序输入。
第二行:表示购物的人数n(1 <= n <= 10000)。
最后n行:每一行表示某个人优惠前的购物总价格(价格取值范围(0, 1000],都为整数)。

约定:输入都是符合题目设定的要求的。

三、输出描述

每行输出每个人每次购物优惠后的最低价格以及使用的优惠券总数量,每行的输出顺序和输入的顺序保持一致。

四、补充说明

1.优惠券数量都为整数,取值范围为[0, 10]。
2.购物人数为整数,取值范围为[1, 10000]。
3.优惠券的购物总价为整数,取值范围为(0, 1000]。
4.优惠后价格如果是小数,则向下取整,输出都为整数。

五、Java算法源码

// 优惠后的最终价格
public static int lastPrice = Integer.MAX_VALUE;
// 分别使用优惠券数量
public static int[] couponCountArr = new int[3];

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int[] coupons = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
    // 满减个数
    int fullReduction = coupons[0];
    // 打折个数
    int discounts = coupons[1];
    // 优惠券数量
    int coupon = coupons[2];

    // 购物的人数
    int n = Integer.valueOf(sc.nextLine());

    int[] priceArr = new int[n];

    for (int i = 0; i < n; i++) {
        // 每一行表示某个人优惠前的购物总价格
        int price = Integer.valueOf(sc.nextLine());
        priceArr[i] = price;
    }

    // 根据每一行输入的优惠前的购物总价格,计算优惠价格
    for (int i = 0; i < n; i++) {
        calculate(priceArr[i], fullReduction, discounts, coupon);
    }
}

/**
 * 根据每一行输入的优惠前的购物总价格,计算优惠价格
 *
 * @param price 优惠前的购物总价格
 * @param fullReduction 满减个数 每满100元优惠10元,无使用数限制
 * @param discounts 打折个数 92折券 1次限使用1张
 * @param coupon 优惠券数量 无门槛5元优惠券,无使用数限制
 */
public static void calculate(int price, int fullReduction, int discounts, int coupon) {
    lastPrice = Integer.MAX_VALUE;
    couponCountArr = new int[3];
    int[] visited = new int[3];
    dfs(price, fullReduction, discounts, coupon, visited, 0, price);
    // 使用优惠券的总张数
    int couponCount = 0;
    for (int i = 0; i < couponCountArr.length; i++) {
        couponCount += couponCountArr[i];
    }
    System.out.println(lastPrice+" "+couponCount);
}

/**
 * 计算使用优惠券
 * @param price 价格
 * @param fullReduction 满减个数
 * @param discounts 打折个数
 * @param coupon 5元优惠券个数
 * @param visited
 * @param couponTimes 使用了几种优惠券
 * @param calculatedPrice 优惠后价格
 */
public static void dfs(int price, int fullReduction, int discounts, int coupon, int[] visited, int couponTimes, int calculatedPrice) {
    if (couponTimes == 2) {
        if (calculatedPrice < lastPrice) {
            lastPrice = calculatedPrice;
        }
        return;
    }
    for (int i = 0; i < visited.length; i++) {
        if (visited[i] == 1) {
            continue;
        }
        visited[i] = 1;
        // 优惠后价格
        // 使用几张优惠券
        int[] couponArr = new int[2];
        if (i == 0) {
            // 满减个数 每满100元优惠10元,无使用数限制
            couponArr = calculateFullReduction(calculatedPrice, fullReduction);
        } else if (i == 1) {
            // 打折
            couponArr = calculateDiscounts(calculatedPrice, discounts);
        } else {
            // 使用5元优惠券
            couponArr = calculateCoupon(calculatedPrice, coupon);
        }
        dfs(price, fullReduction, discounts, coupon, visited, couponTimes + 1, couponArr[0]);
        visited[i] = 0;
    }
}

/**
 * 满减个数 每满100元优惠10元,无使用数限制
 * @param price 当前价格
 * @param fullReduction 满减优惠券个数
 * @return
 */
public static int[] calculateFullReduction(int price, int fullReduction) {
    // 使用满减优惠券的个数
    int a = Math.min(fullReduction, price / 100);
    // 用满减之后的价格
    int preferentialPrice = price;
    // 使用满减优惠券的个数
    int fullReductionUsed = 0;
    for (int i = 0; i < a; i++) {
        if (preferentialPrice > 0) {
            preferentialPrice -= 10;
            fullReductionUsed++;
        }
    }
    // preferentialPrice:使用满减之后的价格
    // fullReductionUsed:可以使用几张满减优惠券
    return new int[]{preferentialPrice, fullReductionUsed};
}

/**
 * 打折个数 92折券 1次限使用1张
 * @param price 当前价格
 * @param discounts 打折优惠券使用个数
 * @return
 */
public static int[] calculateDiscounts(int price, int discounts) {
    // 1次限使用1张
    int discountsCount = Math.min(1, discounts);
    int discountsPrice = price;
    int discountsUsed = 0;
    for (int i = 0; i < discountsCount; i++) {
        if (discountsPrice > 0) {
            discountsUsed++;
            discountsPrice *= 0.92;
        }
    }
    // discountsPrice:打折后的价格
    // discountsUsed:可以使用几张打折优惠券
    return new int[]{discountsPrice, discountsUsed};
}

/**
 * 优惠券数量 无门槛5元优惠券,无使用数限制
 * @param price 当前价格
 * @param coupon 优惠券数量
 * @return
 */
public static int[] calculateCoupon(int price, int coupon) {
    // 使用couponUsed张5元优惠券之后的价格
    int couponPrice = price;
    // 使用几张5元优惠券
    int couponUsed = 0;
    // 使用coupon张5元优惠券
    for (int i = 0; i < coupon; i++) {
        if (couponPrice > 0) {
            couponUsed++;
            couponPrice -= 5;
        }
    }
    // discountsPrice:使用couponUsed张5元优惠券之后的价格
    // couponUsed:使用几张5元优惠券
    return new int[]{Math.max(couponPrice, 0), couponUsed};
}

六、效果展示

1、输入

3 2 5
3
100
200
400

2、输出

65 6
155 7
338 4

3、说明

输入3个人,输出3行结果,同输入的顺序,对应每个人的优惠结果,如下:
第一行:先使用1张满减券优惠到90元,再使用5张无门槛券优惠25元,最终价格是65元,总共使用6张优惠券
第二行:先使用2张满减券优惠到180元,再使用5张无门槛券优惠25元,最终价格是155元,总共使用7张优惠券
第三行:先使用1张92折券优惠到368元,再使用3张满减券优惠30元,最终价格是338元,总共使用4张优惠券

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【跳房子II】【2023 B卷 100分】,附详细解题思路

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/720912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术思维vs管理思维 程序员与项目经理5大思维差异

软件项目中&#xff0c;项目经理出身于程序员的情况较多&#xff0c;这样的项目经理在技术上拥有优势&#xff0c;但作为程序员的技术思维和作为项目经理的管理思维区别较大。因此如果不及时转换思维&#xff0c;往往造成过于纠结项目细节、忽视工期和成本压力&#xff0c;从而…

vmware虚拟机的12个使用技巧

1、增加虚拟机可用的物理内存 关闭虚拟机&#xff0c;设置内存&#xff1a; 2、硬件设备添加 一直选择下一步&#xff0c;直到这个界面进行磁盘大小分配&#xff1a; 3、控制权的切换 由于VMware的工作特点是在一台计算机中同时运行多个操作系统&#xff0c;因此这就存在一个…

排序算法-整理

1.【数据结构】带你玩转排序&#xff1a;堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序 【数据结构】带你玩转排序&#xff1a;堆排序、希尔排序、插入排序、选择排序、冒泡排序、快排(多版本)、归并排序http://t.csdn.cn/fCXSo 2.十大基础算法 …

培训小程序首页开发

目录 1 定义变量2 欢迎语搭建3 分类导航搭建4 搭建底部导航总结 我们本篇来开发一下我们小程序的首页&#xff0c;先看一下原型 1 定义变量 因为我们首页展示的分类信息&#xff0c;现在分类信息已经存到了数据源里&#xff0c;我们要通过变量读取出来。 先打开我们创建的自…

Zabbix之部署

Zabbix 6.0 一.Zabbix介绍 1.zabbix 的含义 zabbix 是一个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案zabbix 能监视各种网络参数&#xff0c;保证服务器系统的安全运营&#xff1b;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各…

matlab用histfit画直方图+拟合曲线

matlab画直方图拟合曲线 成图效果1 数据格式2 绘制步骤3 后话 成图效果 1 数据格式 应该准备一个double的数组&#xff0c;如果是csv或者xlsx直接拖进matlab是table型&#xff0c;这是无法作为绘图参数的 如果是table型&#xff0c;可以使用table2array(data)进行转换 2 绘制…

广东程序员,今年28岁,4年经验月薪13K,仍一事无成

之前认识的一位工作很努力的广州程序员朋友&#xff0c;前天深夜微信拍了拍我——“在吗&#xff1f;播妞”。 他把对未来的迷茫一股脑的倒了出来&#xff1a; 对方拍了拍你的“隐形翅膀” 我在&#xff01; 长夜漫漫无心睡眠&#xff0c;我以为只有我睡不着觉&#xff0c;…

Unity 之 超级详细的隐私问题解决方案

Unity 之 助力游戏增长 -- 解决隐私问题 一&#xff0c;平台测试隐私问题二&#xff0c;解决方式一2.1 勾选自定义Mainifest2.2 修改自定义Mainifest2.3 隐私协议弹窗逻辑 三&#xff0c;解决方式二3.1 导出安卓工程3.2 创建上层Activity3.3 配置AndroidManifest 四&#xff0…

还在为PMO总结发愁?PMO工作总结应该怎么写及实例看这篇就够了

很多公司都要写总结了&#xff0c;作为PMO我们应该如何写工作总结呢&#xff1f;如何写总结能表现自己的价值还能让老板更喜欢看呢&#xff1f;过去一段时间的工作进行回顾总结&#xff0c;发掘问题、总结经验、进行规划等活动的过程。 今天分享给大家一个PMO写总结的方法和实…

Linux5.94 Zabbix服务配置与应用

文章目录 计算机系统5G云计算第四章 LINUX Zabbix服务配置与应用一、Zabbix服务概述1.zabbix 监控原理2.Zabbix 6.0 新特性1&#xff09;Zabbix server高可用防止硬件故障或计划维护期的停机2&#xff09;Zabbix 6.0 LTS新增Kubernetes监控功能&#xff0c;可以在Kubernetes系统…

PCB技巧(五)

一、问题及原因 问题&#xff1a; 对板子进行测试&#xff0c;发现引脚OPA电压不对&#xff0c;DAC输出电压没有问题&#xff0c;OPA接DAC输出应该和DAC电压大致差不多&#xff0c;但是电压差100mV。 原因&#xff1a; 经查找是下图中GND走线与旁边引脚OPO有接触。在未焊接…

香橙派刷机和系统登入

1.刷机 先打开刷机软件&#xff0c;再点击format&#xff0c;然后关闭 完成之后打开win32diskimager 选择映像文件后点击写入 等待写入 写入成功 2.登入香橙派 串口连接 默认登入账号密码为orangepi 密码不会显示

ChatGPT,你的智能助手,社交办公利器

ChatGPT&#xff0c;你的智能助手&#xff0c;社交办公利器&#xff01; 嗨&#xff0c;亲爱的小红书好友们&#xff01;我今天要向大家强力推荐一款让生活工作更轻松的神奇助手——ChatGPT&#xff01;无论是工作中的问题求解、日常生活的疑惑迷茫&#xff0c;还是灵感创作的启…

后台权限管理

1&#xff0c;页面级权限 通过后台接口控制页面级的权限&#xff0c;将数据保存在本地并且和路由匹配&#xff0c;左侧tabber 仅展示导航到拥有权限的页面。或者使用路由拦截的方式也可以。 2&#xff0c;按钮级权限 超级管理员有所有按钮的权限&#xff0c;普通管理员可能…

SpringBoot-Web 整合案例(图书管理系统)

SpringBoot-Web 整合案例讲解&#xff08;图书管理系统&#xff09; 0. 项目预览 1. 创建项目,添加依赖 <dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>…

Zabbix安装

Zabbix6.0 一&#xff1a;zabbix 是什么&#xff1f;二&#xff1a;Zabbix 6.0 新特性&#xff1a;1、Zabbix server高可用防止硬件故障或计划维护期的停机&#xff1a;2、Zabbix 6.0 LTS新增Kubernetes监控功能&#xff0c;可以在Kubernetes系统从多个维度采集指标&#xff1a…

Python API教程:API入门(上)

Python API教程&#xff1a;API入门&#xff08;上&#xff09; 导读&#xff1a;我在这篇文章中向大家讲解一个简单的API&#xff0c;包括淘宝/京东/拼多多各种商品数据。 什么是API&#xff1f; 一个API&#xff0c;或被称为应用程序接口&#xff0c;是一个服务器为你提供一…

LVS负载均衡集群(NAT)

目录 1.LVS 2.集群分类 3.负载均衡集群工作模式 4.负载均衡集群架构 5.LVS作用 6.LVS与nginx比较 7.ipvsadm工具 8.实验 第一台服务器 进入第二台第三台服务器下载http服务nfs服务rpcbind服务并启动 进入第四台服务器 9.总结 1.LVS 负载均衡的结构 2.集群分类 负载均衡…

算法竞赛进阶指南学习--0x20

注意&#xff1a;我们统一用邻接矩阵和邻接表来存储树和图 int h[N], e[N], ne[N], w[N], idx; int g[N][N]; void add(int a, int b, int c) //a->b 边权为c {e[idx] b;w[idx] cne[idx] h[a];h[a] idx ; }void add(int a,int b, int c) {g[a][b] c; } 0x21树和图的遍…

理解和利用小程序开发的法规与合规性

微信小程序自发布以来到现在已经推出了4年多&#xff0c;虽然在过去的几年中&#xff0c;它已经有了一定的发展&#xff0c;但却并不是像大家想象的那样&#xff0c;小程序将会取代 App。相反&#xff0c;现在小程序只是微信生态系统中的一个应用场景&#xff0c;微信通过不断地…