【华为OD题库-041】人气最高的店铺-java

题目

某购物城有m个商铺,现决定举办一场活动选出人气最高店铺。活动共有n位市民参与,每位市民只能投一票,但1号店铺如果给该市民发放q元的购物补贴,该市民会改为投1号店铺。请计算1号店铺需要最少发放多少元购物补贴才能成为人气最高店铺(即获得的票数要大于其他店铺),如果1号店铺本身就是票数最高店铺,返回0。
输入描述:
第一行为小写逗号分割的两个整数n,m,其中第一个整数n表示参与的市民总数,第二个整数m代表店铺总数,1<= n,m <= 3000.
第2到n+1行,每行为小写逗号分割的两个整数p,q,表示市民的意向投票情况,其中每行的第一个整数p表示该市民意向投票给p号店铺,第二个整数q表示其改投1号店铺所需给予的q元购物补贴,1<= p <= m,1<=q <=10^9.不考虑输入的格式问题
输出描述
1号店铺需要最少发放购物补贴金额。
示例1
输入:
5,5
2,10
3,20
4,30
5,40
5,90
输出:
50
说明:
有5个人参与,共5个店铺。
如果选择发放10元+20元+30元=60元的补贴来抢2,3,4号店铺的票,总共发放了60元补贴(5号店铺有2票,1号店铺要3票才能胜出)
如果选择发放10元+40元=50元的补贴来抢2,5号店铺的票,总共发放了50元补贴(抢了5号店铺的票后,现在1号店铺只要2票就能胜出)
所以最少发放50元补贴
示例2
输入:
5,5
2,10
3,20
4,30
5,80
5,90
输出:
60说明:
有5个人参与,共5个店铺.
如果选择发放10元+20元+30元=60元的补贴来抢2,3,4号店铺的票,总共发放了60元补贴(5号店铺有2票,1号店铺要3票才能胜出)
如果选择发放10元+80元=90元的补贴来抢2,5号店铺的票,总共发放了90元补贴(抢了5号店铺的票后,现在1号店铺只要2票就能胜出)
所以最少发放60元补贴

思路

组合思路,列举所有的可能,输出满足条件的最少补贴。组合套路详见:【JAVA-排列组合】一个套路速解排列组合题

  1. 定义votes数组存放每个店铺的意向情况,其中votes[0]代表人气最高店铺的索引,votes[1]代表1号店铺的的票数量,在将输入存入votes时需注意:
    当某个店铺的人气大于votes[0]店铺的人气(即votes[votes[0]]),将该店铺的索引存入votes[0];
    当某个店铺的人气等于votes[0]店铺的人气且该店铺不是一号店铺时,也应该将该店铺的索引存入votes[0]。这样就能保证只有当votes[0]=1时,1号店铺是唯一的人气最高店铺。
  2. 对于每行输入,转为id和price,存入实体VotePrice中,并加入到一个list,因为是要通过给list中的店铺发放补贴,从而将票数给到1号店铺,所以list中不存放1号店铺自身的信息。
    选择组合时,应该考虑剪枝条件,比如对以下数据:

3,5
3,10
4,25
2,25
2,90
不剪枝时,以下两种组合可能对会遍历一次:
3,5、4,25、2,25
3,10、4,25、2,25
很明显,第二次遍历是冗余情况,第一种花5的代价就能拉取到商铺3的投票,第二种却要10的代价。所以当组合中只选一个3时,选了5的代价就没必要选10。此时应该剪枝。list应该按照id,price升序排序

  1. 通过组合可以列举所有可能的情况,计算抢了某些店铺的票后,当前的votes中的人气最高的唯一店铺是否是1号店铺。比如,记当前抢的店铺为cur(list.get(i)):
    那么需要更新人气: votes[1]++; votes[cur.getId()]–;
    回溯移出时则相反: votes[1]–; votes[cur.getId()]++;
  2. 最后检查votes中最高人气的唯一店铺(check方法)是否是1号店铺且补贴使用最少即可

因为最后需要输入的是最少补贴,即不关心具体有哪些组合,所以组合中可以删除中间的path变量

题解

package hwod;import java.util.*;public class VoteMall {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] firstLines = sc.nextLine().split(",");int n = Integer.parseInt(firstLines[0]);int m = Integer.parseInt(firstLines[1]);int[] votes = new int[m + 1];List<VotePrice> list = new ArrayList<>();for (int i = 0; i < n; i++) {String[] lines = sc.nextLine().split(",");int id = Integer.parseInt(lines[0]);int price = Integer.parseInt(lines[1]);if (id != 1) list.add(new VotePrice(id, price));votes[id]++;if (votes[id] > votes[votes[0]] || (id != 1 && votes[id] == votes[votes[0]])) {votes[0] = id;}}System.out.println(voteMall(list, votes));}private static int res = Integer.MAX_VALUE;private static int voteMall(List<VotePrice> list, int[] votes) {Collections.sort(list);if (votes[0] == 1) return 0;//用于剪枝int[] used = new int[list.size()];dfs(list, 0,  used, votes, 0);return res;}private static void dfs(List<VotePrice> list, int start,  int[] used, int[] votes, int price) {if (check(Arrays.copyOfRange(votes, 1, votes.length))) {res = Math.min(res, price);return;}for (int i = start; i < list.size(); i++) {if (i > 0 && list.get(i - 1).getId() == list.get(i).getId() && used[i - 1] == 0) continue; //同层相同剪枝VotePrice cur = list.get(i);votes[1]++;votes[cur.getId()]--;used[i] = 1;dfs(list, i + 1, used, votes, price + cur.getPrice());votes[1]--;votes[cur.getId()]++;used[i] = 0;}}private static boolean check(int[] nums) {int maxIdx = 0;for (int i = 1; i < nums.length; i++) {if (nums[i] >= nums[maxIdx]) {maxIdx = i;}}return maxIdx == 0;}}class VotePrice implements Comparable<VotePrice> {private int id;private int price;public int getId() {return id;}public void setId(int id) {this.id = id;}public int getPrice() {return price;}public void setPrice(int price) {this.price = price;}public VotePrice(int id, int price) {this.id = id;this.price = price;}@Overridepublic int compareTo(VotePrice o) {if (this.getId() != o.getId()) return this.getId() - o.getId();return this.price - o.price;}
}

推荐

如果你对本系列的其他题目感兴趣,可以参考华为OD机试真题及题解(JAVA),查看当前专栏更新的所有题目。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯双向排序

这里写自定义目录标题 题目分析代码思路 题目分析 n,m都是 1 0 5 10^5 105 &#xff0c;需要将时间复杂度控制在 n log ⁡ n n \log n nlogn以内。 如果有两次连续的前缀操作&#xff0c;由于它们都是降序排列&#xff0c;等价于只做第二次排列&#xff0c;忽略掉第一次。 同…

【MediaTek T830】MediaTek T830介绍

MediaTek T830介绍 千兆级吞吐量 MediaTek T830 平台是一个高集成度的系统单芯片&#xff08;SoC&#xff09;&#xff0c;整合了 4G 和 5G 调制解调器、FR1 射频收发器、GNSS 接收机和电源管理系统。高度集成式设计让 T830 拥有更小的尺寸和更低的功耗。设备制造商可使用…

建筑结构健康监测系统和传统人工监测的区别

在繁华的城市里&#xff0c;建筑结构作为城市生命线的重要一环&#xff0c;其安全与稳定对城市的运转和居民的生活至关重要。为了更好地守护建筑结构的健康&#xff0c;WITBEE万宾自主研发建筑结构健康监测系统让建筑安全&#xff0c;在上一个台阶。 WITBEE万宾建筑结构健康监测…

基于C#实现Dijkstra算法

或许在生活中&#xff0c;经常会碰到针对某一个问题&#xff0c;在众多的限制条件下&#xff0c;如何去寻找一个最优解&#xff1f;可能大家想到了很多诸如“线性规划”&#xff0c;“动态规划”这些经典策略&#xff0c;当然有的问题我们可以用贪心来寻求整体最优解&#xff0…

MySQL数据库:外键、唯一键、唯一索引

目录 说明 一、如果要使用外键&#xff0c;表的存储引擎选择哪个&#xff1f; 1.1 答 1.2 示范 1.2.1 主表 &#xff08;1&#xff09;MyISAM的表&#xff1a;masterTable2 &#xff08;2&#xff09;InnoDB的表&#xff1a;masterTable1 1.2.2 从表 &#xff08;1&am…

人力资源管理后台 === 首页+部署

目录 1.首页-echarts图表的应用 2.首页-echarts图表的按需导入 3.路由模式-将路由改成history模式 4. 打包分析-分析 5.CDN加速 6.项目打包-安装nginx 7.mac/windows环境下nginx部署启动项目 8.nginx解决history的404问题 9.nginx配置代理解决生产环境跨域问题 1.首页-…

【学习草稿】pid控制基础实现--往水桶注水

pid 1&#xff09;非常通俗易懂的PID控制&#xff08;1&#xff09;https://zhuanlan.zhihu.com/p/37515841 球场上运动至指定地点&#xff08;比例控制&#xff09;&#xff1a;有图【很直观的帮助理解】&有文字分析 2&#xff09;初识PID-搞懂PID概念 https://zhuanlan.…

Linux4.6、进程优先级

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 进程优先级是什么&#xff1f; 为什么会有进程优先级&#xff1f; 那么优先级是如何办到的&#xff1f; 最后一个问题&#xff1a;Linux为什么要限制优先级&#xff1f; 进程优先级是什么&#xff1f; 就是进程在访…

2021年06月 Scratch图形化(四级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共10题,每题3分,共30分) 第1题 执行下列程序,输出的结果为? A:12 B:24 C:8 D:30 答案:B 第2题 执行下列程序,角色说出的内容是? A:2 B:3 C:4 D:5 答案:A 第3题 执行下列程序,输出结果为?

【Flutter】graphic图表实现自定义tooltip

renderer graphic中tooltip的TooltipGuide类提供了renderer方法,接收三个参数Size类型,Offset类型,Map<int, Tuple>类型。可查到的文档是真的少,所以只能在源码中扒拉例子,做符合需求的修改。 官方github示例 官方示例 这个例子感觉像是tooltip和提供的那些属性的…

2023年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 一、问题求解&#xff1a;真题&#xff08;2023-01&#xff09;真题&#xff08;2023-02&#xff09;真题&#xff08;2023-03&#xff09;真题&#xff08;2023-04&#xff09;真题&#xff08;2023-05&#xff09;真题&#xff08;2023-06&#xff09;真题&#xff…

【密码学】【安全多方计算】浅析隐私求交PSI

文章目录 隐私求交的定义隐私求交方案介绍1. 基于DH的PSI方案2. 基于OT的PSI方案3.基于OPRF的PSI方案 总结 隐私求交的定义 隐私集合求交使得持有数据参与方通过计算得到集合的交集数据&#xff0c;而不泄露任何交集以外的数据信息。 隐私求交方案介绍 1. 基于DH的PSI方案 …

Aapche Dubbo 不安全的 Java 反序列化 (CVE-2019-17564)

漏洞描述 Apache Dubbo 是一个高性能的、基于 Java 的开源 RPC 框架。 Apache Dubbo 支持不同的协议&#xff0c;它的 HTTP 协议处理程序是 Spring Framework 的 .org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter Spring Framework 的安全警告显示&am…

计算机系统漫游

编译系统 预处理&#xff08;Preprocessing&#xff09;&#xff1a; 预处理器根据源代码中的预处理指令&#xff0c;如#include和#define等&#xff0c;将源代码转换为另一份源代码。预处理器的输出通常会保存在hello.i的文件中。编译&#xff08;Compilation&#xff09;&…

为什么要坚持每天做公域引流

做公域不一定等于拍视频&#xff0c;真正适合小白的引流方式其实还是做图文内容&#xff0c;比如小红书发帖&#xff0c;知乎问答&#xff0c;微信读书&#xff0c;问一问等。 长期坚持每天做公域引流有以下好处&#xff1a; 提高品牌知名度&#xff1a;每天坚持做公域流量&a…

nodejs+vue+elementui学生竞赛管理系统65o97

高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生体育 能力与创新思维、学生竟赛管理系统检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而我所在学院多采用半手工管理学生竟赛的方式&#xff0c;所以有必要开发学生竟赛管理系统来对学生…

2015年五一杯数学建模B题空气污染问题研究解题全过程文档及程序

2015年五一杯数学建模 B题 空气污染问题研究 原题再现 近十年来&#xff0c;我国 GDP 持续快速增长&#xff0c;但经济增长模式相对传统落后&#xff0c;对生态平衡和自然环境造成一定的破坏&#xff0c;空气污染的弊病日益突出&#xff0c;特别是日益加重的雾霾天气已经干扰…

前端管理制度

数据运营中心的管理形式&#xff1a; 数据运营中心的管理形式 竖向是各小组 横向是项目管理 负责人的定位&#xff1a; 只是工作的内容不同&#xff0c;没有上下级之分 帮助组员找到适合的位置&#xff0c;帮助大家解决问题&#xff0c;给大家提供资源 前端组的工作形式&am…

MySQL数据库如何实现跨服务器访问数据

点击上方蓝字关注我 在使用MySQL数据库时&#xff0c;很多同学经常会问&#xff0c;我能跨服务器访问另一库的数据么&#xff1f;得到的答案很多时候是让人失望的。那么如果真的需要访问&#xff0c;又不想使用拷贝表及数据的方式&#xff0c;可以实现么&#xff0c;又该如何实…

人工智能“涌现”时刻:数据中心如何解题?

随着科技的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐成为推动社会进步的关键力量。AI技术的广泛应用给我们的生活和工作带来了巨大的改变&#xff0c;而这一切的背后离不开数据中心的支持和创新。数据中心如何解决人工智能的挑战&#xff0c;成为了当今科…