华为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标签直接引…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...