华为OD机试之模拟商场优惠打折(Java源码)

模拟商场优惠打折

题目描述

模拟商场优惠打折,有三种优惠券可以用,满减券、打折券和无门槛券。
满减券:满100减10,满200减20,满300减30,满400减40,以此类推不限制使用;
打折券:固定折扣92折,且打折之后向下取整,每次购物只能用1次;
无门槛券:一张券减5元,没有使用限制。
每个人结账使用优惠券时有以下限制:

  1. 每人每次只能用两种优惠券,并且同一种优惠券必须一次用完,不能跟别的穿插使用(比如用一张满减,再用一张打折,再用一张满减,这种顺序不行)。
  2. 求不同使用顺序下每个人用完券之后得到的最低价格和对应使用优惠券的总数;如果两种顺序得到的价格一样低,就取使用优惠券数量较少的那个。

输入描述

第一行三个数字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减30
		dzq = Integer.parseInt(input.split(" ")[1]); // 打折券数量 92折 向下取整
		wmkq = Integer.parseInt(input.split(" ")[2]); // 无门槛券 减5元 价格>=0
		int 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;
	}
}

上述代码及运行示意图:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GoWeb -- gin框架的入门和使用

认识gin go流行的web框架 go从诞生之初就带有浓重的开源属性&#xff0c;其原生库已经很强大&#xff0c;即使不依赖框架&#xff0c;也能进行高性能开发&#xff0c;又因为其语言并没有一定的设计标准&#xff0c;所以较为灵活&#xff0c;也就诞生了众多的框架&#xff0c;各…

视频怎么加水印?如何录制带水印的视频?

案例&#xff1a;如何给视频添加水印&#xff1f; 【我发布在短视频平台的视频&#xff0c;总是被别人盗用&#xff0c;我想给自己的视频添加水印。有没有视频添加水印的方法&#xff1f;在线等&#xff01;】 很多视频制作者或者爱好者&#xff0c;都希望自己的视频作品得到…

腾讯云轻量服务器镜像安装宝塔Linux面板怎么使用?

腾讯云轻量应用服务器宝塔面板怎么用&#xff1f;轻量应用服务器如何安装宝塔面板&#xff1f;在镜像中选择宝塔Linux面板腾讯云专享版&#xff0c;在轻量服务器防火墙中开启8888端口号&#xff0c;然后远程连接到轻量服务器执行宝塔面板账号密码查询命令&#xff0c;最后登录和…

【P31】JMeter 循环控制器(Loop Controller)

这文章目录 一、循环控制器&#xff08;Loop Controller&#xff09;参数说明二、测试计划设计2.1、设置循环次数2.2、勾选永远2.3、设置线程组的持续时间 一、循环控制器&#xff08;Loop Controller&#xff09;参数说明 可以对部分逻辑按常量进行循环迭代 选择线程组右键 …

Lua学习笔记:C/C++和Lua的相互调用

前言 本篇在讲什么 C/C和Lua的相互调用 本篇适合什么 适合初学Lua的小白 适合需要C/C和lua结合开发的人 本篇需要什么 对Lua语法有简单认知 对C/C语法有简单认知 依赖Lua5.1的环境 依赖VS 2017编辑器 本篇的特色 具有全流程的图文教学 重实践&#xff0c;轻理论&…

【2023 · CANN训练营第一季】基于昇腾910的TF网络脚本训练(ModelArts平台)

准备工作: 1.注册华为云账号&#xff0c;获取AK/SAK&#xff0c;授权ModelArts&#xff0c;并申请华为云代金券 2.获取训练数据集&#xff0c;并进行数据预处理&#xff0c;比如离线制作成tfrecords(建议&#xff0c;可选) 3.将数据集(训练脚本)上传到OBS 4.安装PycharmIDE及To…

Word控件Spire.Doc 【其他】教程(4):在 Word 中插入上标和下标

Spire.Doc for .NET是一款专门对 Word 文档进行操作的 .NET 类库。在于帮助开发人员无需安装 Microsoft Word情况下&#xff0c;轻松快捷高效地创建、编辑、转换和打印 Microsoft Word 文档。拥有近10年专业开发经验Spire系列办公文档开发工具&#xff0c;专注于创建、编辑、转…

注意力Transformer

注意力 注意力分为两步&#xff1a; 计算注意力分布 α \alpha α 其实就是&#xff0c;打分函数进行打分&#xff0c;然后softmax进行归一化 根据 α \alpha α来计算输入信息的加权平均&#xff08;软注意力&#xff09; 其选择的信息是所有输入向量在注意力下的分布 打…

Docker 设置国内镜像源

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到网络问题&#xff0c;此时可以配置国内的镜像加速来下载。Docker 官方和国内很多云服务商都提供了国内加速器服务&#xff0c;例如如下&#xff1a; 科大镜像&#xff1a;https://docker.mirrors.ustc.edu.cn/网易&#…

ATA-4014高压功率放大器驱动超声马达测试应用

ATA-4014 高压功率放大器简介 ATA-4014是一款理想的可放大交、直流信号的单通道高压功率放大器。最大输出160Vp-p&#xff08;80Vp&#xff09;电压&#xff0c;452Wp功率&#xff0c;可以驱动高压功率型负载。电压增益数控可调&#xff0c;一键保存常用设置&#xff0c;为您提…

抽象轻松js

重复声明 经过了这么久&#xff0c;对声明变量应该差不多了解了&#xff0c;再加上之前了解的作用域 我们现在开始如果科学的使用重复声明 先复习一边(遍)作用域 var的作用域是全局 let、const的作用域是花括号 了解这点&#xff0c;那么科学使用重复声明就是合理使用作用…

C++11之atomic原子操作

atomic介绍 多线程间是通过互斥锁与条件变量来保证共享数据的同步的&#xff0c;互斥锁主要是针对过程加锁来实现对共享资源的排他性访问。很多时候&#xff0c;对共享资源的访问主要是对某一数据结构的读写操作&#xff0c;如果数据结构本身就带有排他性访问的特性&#xff0c…

如何用chatGPT赚钱?

赚钱思路 1&#xff09;初级-账号 对于新事物的出现&#xff0c;很多人对此都是抱着一个看热闹的态度&#xff0c;大家对于这个东西的整体认知水平是很低的&#xff01; 所以这个时候的思路就是快速去抢占市场&#xff0c;去各个平台发一些和ChatGPT相关的视频和文章去抢占市…

css、js(vue)进行textarea自适应高度(超详细说明)

文章目录 需求——如下图一、纯css 的自适应高度&#xff08;有问题&#xff0c;不推荐&#xff09;1.css代码2. html代码3. 代码截图说明4. 效果和会出现的问题 二、js 的自适应高度0.思路1.代码1. css代码2. html代码3. js代码 2.代码说明3.注意点导致的问题&#xff08;0&am…

GP05丨多因子IC对冲

量化策略开发&#xff0c;高质量社群&#xff0c;交易思路分享等相关内容 大家好&#xff0c;今天我们分享股票社群第5期量化策略——多因子IC对冲。 在前几期中&#xff0c;我们分享了GP01多因子、ETF轮动策略及Plus版本、网格等等。本期我们继续分享多因子策略。 策略背景与…

【P32】JMeter While 控制器(While Controller)

文章目录 一、While 控制器&#xff08;While Controller&#xff09;参数说明二、测试计划设计2.1、变量2.2、函数2.2.1、groovy脚本2.2.2、jex13脚本2.2.3、js脚本 一、While 控制器&#xff08;While Controller&#xff09;参数说明 可以对部分逻辑按变量条件进行循环迭代…

CentOS7编译安装Python3.10(含OpenSSL1.1.1安装),创建虚拟环境,运行Django项目(含sqlite版本报错)

文章目录 1、CentOS安装OpenSSL1.1.1&#xff08;前置环境&#xff09;2、CentOS安装 Python 3.103、创建虚拟环境4、运行Django项目 1、CentOS安装OpenSSL1.1.1&#xff08;前置环境&#xff09; 编译安装Python3.10时需要openssl1.1.1 查看当前版本 & 删除openssl1.0 …

代码随想录算法训练营第三十九天 | 力扣 62.不同路径, 63. 不同路径 II

62.不同路径 题目 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多…

C++数据结构:二叉树之一(数组存储)

文章目录 前言一、二叉树的基本定义二、二叉树的基本性质三、二叉树的存储&#xff08;数组&#xff09;总结原创文章&#xff0c;未经许可&#xff0c;禁止转载 前言 树是一种非线性数据结构&#xff0c;它由若干个节点和边组成。每个节点都有一个值&#xff0c;而边则表示节…

day17 - 用形状包围图像

在进行图像轮廓提取时&#xff0c;有的情况下不需要我们提取出精确的轮廓&#xff0c;只要提取出一个接近于轮廓的近似多边形&#xff0c;就可以满足后续的操作。 本期我们来学习如何通过设置参数来找出图像的近似多边形。 完成本期内容&#xff0c;你可以&#xff1a; 了解…