牛客小白月赛82 --- D题 Kevin逛超市 2 (困难版本)--- 题解

2023-12-02 15:12

本文主要是介绍牛客小白月赛82 --- D题 Kevin逛超市 2 (困难版本)--- 题解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

D题 Kevin逛超市

题目描述

输入描述:

输出描述:

输入

输出

说明

思路:

代码:


 

D题 Kevin逛超市

题目描述

Take that money, and watch it burn\sf Take\ that\ money,\ and\ watch\ it\ burnTake that money, and watch it burn

Sink in the river, the lessons I’ve learned\sf Sink\ in\ the\ river,\ the\ lessons\ I’ve\ learnedSink in the river, the lessons I’ve learned

       —— Counting Stars, OneRepublicCounting\ Stars,\ \text{OneRepublic}Counting Stars, OneRepublic

两个版本唯一的不同是:简单版本中折扣券和立减券的数量均为 111,困难版本中折扣券和立减券的数量为给定值。


氧气少年在逛超市。

他总共买了 nnn 件商品,第 iii 种商品的价格为 pip_ipi​。

超市有下面的打折政策:

  •  每名顾客有 aaa 张折扣券,可以让一件商品的价格打折(如果此商品原价为 pip_ipi​,那么使用此优惠券后,价格变为 pi×x%p_i\times x\%pi​×x%)。
  •  每名顾客有 bbb 张立减券,可以让一件商品的价格减小 yyy(如果此商品原价小于 yyy,那么可以花费 000 买下)。
  •  每个商品最多使用 111 张优惠券。

请求出氧气少年可能付出的最小的花费。

输入描述:

第一行包含一个整数 T(1≤T≤10^5),表示测试用例的组数。对于每组测试用例:第一行包含五个整数 (1≤n≤2⋅10^5),(0≤a,b≤n),(1≤x≤99),(1≤y≤10^4)
第二行包含 n 个整数 p1…pn ,表示商品的价格。保证对于所有的测试用例,nnn 的总和不超过 2⋅10^5

输出描述:

对于每组测试用例:仅输出一行,包含一个实数,表示答案。如果你的答案和标准答案的绝对误差或相对误差不超过 10−410^{-4}10−4,则你的答案会被视为正确。

示例1

输入

6
3 2 1 50 50
100 100 50
3 3 1 50 200
100 100 45
3 2 2 36 3
5 8 1
3 3 3 99 500
100 600 1000
3 3 3 1 1
100 600 1000
3 0 0 1 1
100 600 1000

输出

100.000000000000
72.500000000000
4.680000000000
600.000000000000
17.000000000000
1700.000000000000

说明

对于第一组样例数据:
可以对编号为 1,21,21,2 的商品使用折扣券,对编号为 333 的商品使用立减券。对于第二组样例数据:
可以对编号为 1,31,31,3 的商品使用折扣券,对编号为 222 的商品使用立减券。

思路:

这道题就是一个简单的贪心,因为对于商品使用优惠券只有两种情况,要么使用折扣卷,要么使用立减卷,并且对于折扣卷来说,如果他的价值越高,折扣越多,所以优先对于价值高的物品使用折扣卷,然后对于立减卷来说,如果这个物品价值都高于他,那么他的作用是等同的,如果这个物品价值低于他,越高的物品价值,省去的钱越多。

所以通过这里分析可知,我们应该对价格高的(a+b)个物品使用优惠券,枚举这a+b个商品,不管优惠券数量,每个商品选择最优的优惠券使用,如果某个优惠券数量用多了(不妨设是x类型用多了),则考虑把一部分使用x类型的商品改为使用y类型,怎么改呢,这里又是一个贪心,把所有使用x类型优惠券的商品按“使用y的优惠减去使用x的优惠”排序,相当于如果算出改变这些商品使用的优惠券类型,带来的增量是多少,然后优先选择增量小的就行,直到优惠券数量平衡。

代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.util.Arrays;
import java.util.Scanner;/*** @ProjectName: study3* @FileName: Ex34* @author:HWJ* @Data: 2023/12/2 9:43*/
public class Main {public static void main(String[] args) throws IOException {StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));in.nextToken();int t = (int)in.nval;for (int o = 0; o < t; o++) {in.nextToken();int n = (int) in.nval;in.nextToken();int a = (int) in.nval;in.nextToken();int b = (int) in.nval;in.nextToken();double x = (int) in.nval /100.0;in.nextToken();int y = (int) in.nval;double[][] arr = new double[n][3];double total = 0;for (int i = 0; i < n; i++) {in.nextToken();arr[i][0] = (int) in.nval;arr[i][1] = arr[i][0] * (1 - x);arr[i][2] = Math.min(arr[i][0], y);total+=arr[i][0];}int cntA = 0;int cntB = 0;Arrays.sort(arr, ((o1, o2) -> {return (int) (o2[0] - o1[0]);}));double[] df = new double[Math.min(a + b, n)];int p = 0;for (int i = 0; i < Math.min(a + b, n); i++) {if (arr[i][1] > arr[i][2]){total -= arr[i][1];cntA++;}else {total -= arr[i][2];cntB++;}df[p++] = arr[i][1] - arr[i][2];}Arrays.sort(df);if (cntA <= a && cntB <= b){System.out.println(total);} else if (cntA > a) {int k = cntA - a;for (int i = 0; i < a + b; i++) {if (df[i] <= 0) continue;total += df[i];k--;if (k == 0) break;}System.out.println(total);}else {int k = cntB - b;for (int i = Math.min(a + b, n) - 1; i >= 0; i--) {if (df[i] > 0) continue;total -= df[i];k--;if (k == 0) break;}System.out.println(total);}}}
}

这篇关于牛客小白月赛82 --- D题 Kevin逛超市 2 (困难版本)--- 题解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/445806

相关文章

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

什么是 Ubuntu LTS?Ubuntu LTS和普通版本区别对比

《什么是UbuntuLTS?UbuntuLTS和普通版本区别对比》UbuntuLTS是Ubuntu操作系统的一个特殊版本,旨在提供更长时间的支持和稳定性,与常规的Ubuntu版本相比,LTS版... 如果你正打算安装 Ubuntu 系统,可能会被「LTS 版本」和「普通版本」给搞得一头雾水吧?尤其是对于刚入

windows端python版本管理工具pyenv-win安装使用

《windows端python版本管理工具pyenv-win安装使用》:本文主要介绍如何通过git方式下载和配置pyenv-win,包括下载、克隆仓库、配置环境变量等步骤,同时还详细介绍了如何使用... 目录pyenv-win 下载配置环境变量使用 pyenv-win 管理 python 版本一、安装 和

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

PostgreSQL中的多版本并发控制(MVCC)深入解析

引言 PostgreSQL作为一款强大的开源关系数据库管理系统,以其高性能、高可靠性和丰富的功能特性而广受欢迎。在并发控制方面,PostgreSQL采用了多版本并发控制(MVCC)机制,该机制为数据库提供了高效的数据访问和更新能力,同时保证了数据的一致性和隔离性。本文将深入解析PostgreSQL中的MVCC功能,探讨其工作原理、使用场景,并通过具体SQL示例来展示其在实际应用中的表现。 一、

【秋招笔试】9.07米哈游秋招改编题-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 大厂实习经历 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收集 100+ 套笔试题,笔试真题 会在第一时间跟新 🍄 题面描述等均已改编,如果和你笔试题看到的题面描述