牛客小白月赛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

相关文章

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

MySQL版本问题导致项目无法启动问题的解决方案

《MySQL版本问题导致项目无法启动问题的解决方案》本文记录了一次因MySQL版本不一致导致项目启动失败的经历,详细解析了连接错误的原因,并提供了两种解决方案:调整连接字符串禁用SSL或统一MySQL... 目录本地项目启动报错报错原因:解决方案第一个:第二种:容器启动mysql的坑两种修改时区的方法:本地

conda安装GPU版pytorch默认却是cpu版本

《conda安装GPU版pytorch默认却是cpu版本》本文主要介绍了遇到Conda安装PyTorchGPU版本却默认安装CPU的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、问题描述二、网上解决方案罗列【此节为反面方案罗列!!!】三、发现的根本原因[独家]3.1 p

Redis指南及6.2.x版本安装过程

《Redis指南及6.2.x版本安装过程》Redis是完全开源免费的,遵守BSD协议,是一个高性能(NOSQL)的key-value数据库,Redis是一个开源的使用ANSIC语言编写、支持网络、... 目录概述Redis特点Redis应用场景缓存缓存分布式会话分布式锁社交网络最新列表Redis各版本介绍旧

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

查看MySQL数据库版本的四种方法

《查看MySQL数据库版本的四种方法》查看MySQL数据库的版本信息可以通过多种方法实现,包括使用命令行工具、SQL查询语句和图形化管理工具等,以下是详细的步骤和示例代码,需要的朋友可以参考下... 目录方法一:使用命令行工具1. 使用 mysql 命令示例:方法二:使用 mysqladmin 命令示例:方

Java版本不兼容问题详细解决方案步骤

《Java版本不兼容问题详细解决方案步骤》:本文主要介绍Java版本不兼容问题解决的相关资料,详细分析了问题原因,并提供了解决方案,包括统一JDK版本、修改项目配置和清理旧版本残留等步骤,需要的朋... 目录错误原因分析解决方案步骤第一步:统一 JDK 版本第二步:修改项目配置第三步:清理旧版本残留兼容性对

Linux搭建单机MySQL8.0.26版本的操作方法

《Linux搭建单机MySQL8.0.26版本的操作方法》:本文主要介绍Linux搭建单机MySQL8.0.26版本的操作方法,本文通过图文并茂的形式给大家讲解的非常详细,感兴趣的朋友一起看看吧... 目录概述环境信息数据库服务安装步骤下载前置依赖服务下载方式一:进入官网下载,并上传到宿主机中,适合离线环境

浅谈配置MMCV环境,解决报错,版本不匹配问题

《浅谈配置MMCV环境,解决报错,版本不匹配问题》:本文主要介绍浅谈配置MMCV环境,解决报错,版本不匹配问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录配置MMCV环境,解决报错,版本不匹配错误示例正确示例总结配置MMCV环境,解决报错,版本不匹配在col