华为OD机试之模拟商场优惠打折(Java源码)
模拟商场优惠打折
题目描述
模拟商场优惠打折,有三种优惠券可以用,满减券、打折券和无门槛券。
满减券:满100减10,满200减20,满300减30,满400减40,以此类推不限制使用;
打折券:固定折扣92折,且打折之后向下取整,每次购物只能用1次;
无门槛券:一张券减5元,没有使用限制。
每个人结账使用优惠券时有以下限制:
- 每人每次只能用两种优惠券,并且同一种优惠券必须一次用完,不能跟别的穿插使用(比如用一张满减,再用一张打折,再用一张满减,这种顺序不行)。
- 求不同使用顺序下每个人用完券之后得到的最低价格和对应使用优惠券的总数;如果两种顺序得到的价格一样低,就取使用优惠券数量较少的那个。
输入描述
第一行三个数字m,n,k,分别表示每个人可以使用的满减券、打折券和无门槛券的数量;
第二行一个数字x, 表示有几个人购物;
后面x行数字,依次表示是这几个人打折之前的商品总价。
输出描述
输出每个人使用券之后的最低价格和对应使用优惠券的数量
用例
| 输入 | 3 2 5 3 100 200 400 |
| 输出 | 65 6 135 8 275 8 |
| 说明 | 输入: 第一行三个数字m,n,k,分别表示每个人可以使用的满减券、打折券和无门槛券的数量。 输出: 第一个人使用 1 张满减券和5张无门槛券价格最低。(100-10=90, 90-5*5=65) 第二个人使用 3 张满减券和5张无门槛券价格最低。(200-20-10-10=160, 160 – 5*5 = 135) 第二个人使用 3 张满减券和5张无门槛券价格最低。(400-40-30-30=300, 300 – 5*5=275) |
源码和解析
解析:
这个题其是暴力求解即可,因为只有三种券且每次只能使用2种。因此按使用顺序不同可以得到6种计算方式。分别对用户输入的价格进行每种方式求解后取最优值即可。
思考?如果券种类多一点,每次使用的数量多一点。那么组合方式就很难,暴力破解就无法了。
示例代码:
import java.util.Scanner;public class T36 {static int mjq;static int dzq;static int wmkq;static class Group {int price;// 打折后价格int num;// 优惠券使用熟练}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String input = scanner.nextLine();mjq = Integer.parseInt(input.split(" ")[0]);// 满减券数量 100减10 200减20// 300减30dzq = Integer.parseInt(input.split(" ")[1]); // 打折券数量 92折 向下取整wmkq = Integer.parseInt(input.split(" ")[2]); // 无门槛券 减5元 价格>=0int nums = Integer.parseInt(scanner.nextLine());for (int i = 0; i < nums; i++) {int price = Integer.parseInt(scanner.nextLine());Group g = getMinPrice(price);System.out.println(g.price + " " + g.num);}}public static Group getMinPrice(int price) {String ways[] = { "MD", "MY", "DM", "DY", "YM", "YD" };Group group = new Group();group.price = price;group.num = dzq + mjq + wmkq;for (String way : ways) {Group g = count(way, price);if (g.price < group.price) {group.price = g.price;group.num = g.num;} else if (g.price == group.price) {if (g.num < group.num) {group.num = g.num;}}}return group;}public static Group count(String way, int price) {// Map<Integer, Integer> map = new HashMap<Integer, Integer>(); // 价格// 和数量Group group = new Group();int mjCount = 0;// 满减券使用数量int wmqCount = 0;// 优惠券使用数量switch (way) {case "MD":// 先满减 再打折while (mjCount < mjq && price >= 100) {int num = (int) (price / 100) * 10;// System.out.println(price+"_"+num);price -= num;mjCount++;}// System.out.println("满减后的价格" + price);price = (int) (price * 0.92);// System.out.println("打折后的价格" + price);group.price = price;group.num = mjCount + 1;break;case "MY":// 先满减 无门槛券while (mjCount < mjq && price >= 100) {int num = (int) (price / 100) * 10;// System.out.println(price+"_"+num);price -= num;mjCount++;}// System.out.println("满减后的价格" + price);while (price > 0 && wmqCount < wmkq) {price -= 5;price = price < 0 ? 0 : price;wmqCount++;}group.price = price;group.num = mjCount + wmqCount;// System.out.println("无门槛后的价格" + price);break;case "DM":// 先打折再满减price = (int) (price * 0.92);// 先满减 再打折// System.out.println("打折后的价格" + price);while (mjCount < mjq && price >= 100) {int num = (int) (price / 100) * 10;// System.out.println(price+"_"+num);price -= num;mjCount++;}// System.out.println("满减后的价格" + price);group.price = price;group.num = mjCount + 1;break;case "DY":// 先打折 再使用无门槛券price = (int) (price * 0.92);// System.out.println("打折后的价格" + price);while (price > 0 && wmqCount < wmkq) {price -= 5;price = price < 0 ? 0 : price;wmqCount++;}// System.out.println("无门槛券后的价格" + price);group.price = price;group.num = wmqCount + 1;break;case "YM":// 先使用无门槛券 再满减while (price > 0 && wmqCount < wmkq) {price -= 5;wmqCount++;price = price < 0 ? 0 : price;}// System.out.println("无门槛券后的价格" + price);while (mjCount < mjq && price >= 100) {int num = (int) (price / 100) * 10;price -= num;mjCount++;}// System.out.println("满减后的价格" + price);group.price = price;group.num = mjCount + wmqCount;break;case "YD":// 先使用 无门槛券 再使用打折while (price > 0 && wmqCount < wmkq) {price -= 5;wmqCount++;price = price < 0 ? 0 : price;}// System.out.println("无门槛券后的价格" + price);price = (int) (price * 0.92);// System.out.println("打折后的价格" + price);group.price = price;group.num = wmqCount + 1;default:break;}return group;}
}
上述代码及运行示意图:

相关文章:
华为OD机试之模拟商场优惠打折(Java源码)
模拟商场优惠打折 题目描述 模拟商场优惠打折,有三种优惠券可以用,满减券、打折券和无门槛券。 满减券:满100减10,满200减20,满300减30,满400减40,以此类推不限制使用; 打折券&…...
5月VR大数据:Quest 2下跌超1%,其它变化不大
Hello大家好,每月一期的VR内容/硬件大数据统计又和大家见面了。 想了解VR软硬件行情么?关注这里就对了。我们会统计Steam平台的用户及内容等数据,每月初准时为你推送,不要错过喔! 本数据报告包含:Steam VR硬…...
CW32系列模数转换器(ADC)
模数转换器(ADC)的主要功能是将模拟量转换为数字量,方便MCU进行处理。下面以CW32L083为例介绍CW系列的模数转换器的特点和功能,并提供演示实例。 一、概述 CW32L083 内部集成一个 12 位精度、最高 1M SPS 转换速度的逐次逼近型模…...
电动力学专题:电磁场规范不变性与规范自由度
对称性,不变性,相对性,协变形 在现代物理学中常常被认为具有相同的含义(好拗口) 规范与规范的自由度 保证电磁场物理量不改变的情况下,有多组势可供选择,而每组势可以称为一个规范 规范不变性…...
max delay的应用场景与常见问题
max delay与min delay用来约束start points到endpoints点对点的路径长度,set_max_delay约束最大值,set_min_delay约束最小值。 max delay的-from和-to并不局限在get_pins,get_cells和get_clocks同样可以。 set_max_delay 5 -from UFF0/Q -to UFF1/D set_max_delay -from …...
非阻塞队列
非阻塞队列 首先我们要简单的理解下什么是非阻塞队列: 与阻塞队列相反,非阻塞队列的执行并不会被阻塞,无论是消费者的出队,还是生产者的入队。 在底层,非阻塞队列使用的是CAS(compare and swap)来实现线程执行的非阻塞…...
动力电池管理系统(BMS)
BMS技术 目录 BMS技术 一、BMS简介 二、BMS主要功能 1、参数检测 2、剩余电量(SOC)估计 3、充放电控制 4、热管理 5、均衡控制 6、故障诊断 7、信息监控 8、参数标定 9、CAN总线接口 三、BMS架构组成 1、BMS的拓扑架构 1、1集中式架构的B…...
ChatGPT桌面客户端支持gpt4模型,附使用说明
#软件核心功能: 1、支持OpenAI官方秘钥及API2D双秘钥使用;如果全局魔法,可以自己用官方秘钥;没魔法国内可直接使用API2D秘钥; 2、内置GPT4模型选项,如果你的官方秘钥支持可直接使用;你也可以注册…...
Vivado下时序逻辑模块的仿真
文章目录 D触发器两级D触发器带异步复位的D触发器带异步复位和同步置数的D触发器移位寄存器单口RAM伪双口RAM真双口RAM单口ROM 组合逻辑电路在逻辑功能上特点是任意时刻的输出仅仅取决于当前时刻的输入,与电路原来的状态无关。 时序逻辑在逻辑功能上的特点是任意时刻…...
ThreadLocal的使用方式
1. ThreadLocal的使用方式 (1) 在关联数据类中创建private static ThreadLocal 在下面的类中,私有静态 ThreadLocal 实例(serialNum)为调用该类的静态 SerialNum.get() 方法的每个 线程维护了一个“序列号”,该方法将返回当前…...
全面理解:C++中的指针和迭代器,以及解引用操作符(*)和箭头操作符(->)的用法
指针与迭代器的基础概念 指针: 指针是一种变量,其值为另一种类型的对象在计算机内存中的地址。你可以使用指针来直接访问和操作它指向的对象。指针的使用非常强大,但也很危险,因为你有可能错误地操作内存,这可能会导致…...
Vite 使用学习指南
Vite 的基本概念和特点 Vite 是什么,它的主要特点是什么 Vite 是一个基于 ES modules 的前端构建工具,它的主要特点包括: 快速的冷启动:Vite 采用了基于浏览器原生 ES 模块的开发模式,可以在开发时快速启动应用&…...
【算法训练(day6)】双指针模板
一.双指针算法的由来和使用场景 通常情况下我们可能会遇到在某些可遍历的集合中寻找满足某种性质的字串或元素。这时候我们采取暴力的思路就会面临多重循环。我们可以利用题目中所给的集合并利用其性质将多重循环降成一重循环。光用语言描述可能不太好理解。接下来看几个双指针…...
免费常用的API接口大全
免费常用的API接口大全 OPEN AI : ChatGPT 能够模拟人类的语言行为,与用户进行自然的交互。ChatGPT 可以用于处理多种类型的对话,包括对话机器人、问答系统和客服机器人等。它还可以用于各种自然语言处理任务,比如文本摘要、情感分…...
【HTML】第 2 节 - HTML 标签
欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、标题标签 3、段落标签 4、文本格式化标签 5、图像标签 5.1、基本作用 5.2、属性 6、超链接标签 7、音频标…...
MATLAB算法实战应用案例精讲-【数模应用】残差检验(附Java、python和MATLAB代码)
目录 几个高频面试题目 线性回归残差是否一定满足正态分布? 一般情况 特殊情况...
初学Qt(Day03)
今天概览 今天的目标是写一个动态的彩虹灯 一开始是有思路的。只是写的过程中有太多小bug了,真的是防不胜防 我的思路是: 主界面是一个开始界面,点击开始按钮之后,有一个子界面出现,显示出彩虹灯转动的效果。 内部的执…...
皮卡丘xss之htmlspecialchars、xss之href输出、xss之js输出
1.xss之htmlspecialchars htmlspecialchars()函数的功能如下: htmlspecialchars() 函数把预定义的字符转换为 HTML 实体。 预定义的字符是: (1)& (和号)成为 & (2)…...
ArrayList和LinkedList的区别
ArrayList和Vector使用了数组的实现,可以认为ArrayList或者Vector封装了对内部数组的操作,比如向数组中添加,删除,插入新的元素或者数据的扩展和重定向。 LinkedList使用了循环双向链表数据结构。与基于数组ArrayList相比…...
记录 vue3 webpack 使用 iframe 遇到的坑
需求 我尝试用Vue3写一个自己的主页,把常用的功能集中到主页中,如下图 后发现一个好玩的东西,js实现的在网页底部出现鱼和波浪,如下图,就像想也放到自己的主页中,搜索后发现可以在Vue中用iframe标签直接引…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
计算机基础知识解析:从应用到架构的全面拆解
目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...
毫米波雷达基础理论(3D+4D)
3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
