华为OD机试题-贪心歌手

题目解析

题目描述
歌手准备从 A 城去 B 城参加演出

  1. 按照合同,他必须在 T 天内赶到。
  2. 歌手途径 N 座城市。歌手不能往回走。
  3. 每两座城市之间需要的天数都可以提前获知。
  4. 歌手在每座城市都可以在路边卖唱赚钱。经过调研,歌手提前获知了每座城市卖唱的收入预期。如果在一座城市第一天卖唱可以赚 M,后续每天的收入会减少 D (第二天赚的钱是 M-D,第三天是 M-2D…)。如果收入减到 0 就不会再少了。
  5. 歌手到达后的第二天才能开始卖唱。如果今天卖过唱,第二天才能出发(即按整天算)。

输出
输出歌手在旅途中最多能挣多少钱。

输入描述
第一行两个数字 T 和 N,中间用空格隔开。

T 代表总天数,0 < T < 1000N 代表路上经过 N 座城市,0 < N < 100

第二行 N+1 个数字,中间用空格隔开。代表每两座城市之间耗费的时间。其总和 ≤ T。

接下来 N 行,每行两个数字 M 和 D,中间用空格隔开。代表每个城市的输入预期。

0 < M < 10000 < D < 100

示例

输入:
10 2
1 1 2
120 20
90 10输出:
540

说明

  • 总共 10 天,路上经过 2 座城市。 路上共花 1+1+2=4 天。
  • 剩余 6 天最好的计划是在第一座城市待 3 天,在第二座城市待 3 天。 在第一座城市赚的钱:120 + 100 + 80 = 300 在第二座城市赚的钱:90 + 80 + 70 = 240
  • 共 300 +240 = 540

题解

题目已经告诉了总天数T、走完整个旅途在路上所需的天数roadCost,因此可以知道 在途中唱歌卖艺挣钱的天数remain
也就是说,题目可以转换为,在remain天内,最多可以挣多少钱。
旅途中,每天可以挣钱数目为:

m1, m1-d1, .... (m1- remain*d1) 
...
mn, mn-dn, .... (mn- remain*dn) 【每个元素都需要>0】

即,是在上面的范围内选择。因此有两种思路:(都是贪心思路,每次都选取当前最优解)

  1. 将上面的选项数值全部先计算出来,然后选取其中前remain个最大的,然后算出总和就可以得到结果;
  2. 使用(最小堆)优先队列,将这些结果依次装入队列中, 如果当前待装入的值:(即,每次装入的值要尽可能的大)
    • 大于队列中的最小值,则将该最小值抛弃,接纳该待装入的值;
    • 小于队列中的最小值,则什么都不做。

到最后,队列中剩余的remain个元素,就是选项范围内的前remian个最大的值,算出总和就是结果。

代码:

public class Greedy_Singer {static int t; // 总天数static int n; // 城市数量static int roadCost; // 旅途中花费在路上的时间static int[][] mds; // 每个城市的 预期收入 与 递减值public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取 总天数t 和 城市数量nt = sc.nextInt();n = sc.nextInt();// 读取 城市间的旅行时间,并计算花费在路上的时间 roadCostroadCost = 0;for (int i = 0; i < n+1; i++) {roadCost += sc.nextInt();}// 读取每个城市的收入预期M 和 递减值Dmds = new int[n][2];for (int i = 0; i < n; i++) {mds[i][0] = sc.nextInt();mds[i][1] = sc.nextInt();}// 输出最大收益System.out.println(getResult());}public static int getResult() {// 计算用于卖唱的时间(天)int remain = t - roadCost;// 如果剩余天数 ≤0,则直接返回0if (remain <= 0) {return 0;}// 使用优先队列(最小堆)来存储收益PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> a - b);// 遍历每个城市for (int[] md : mds) {int m = md[0];int d = md[1];// 计算每天的收益,并将其添加到优先队列中while (m > 0) {// (贪心选取,当队列满了(队列大小 = 剩余天数)之后,需要每次选取当前可知的较大者)// 如果 优先队列大小 已经 达到剩余天数了,则需要比较当前收益 与 队列中最小值if (pq.size() >= remain) {if (m > pq.peek()) {pq.poll(); // 弹出最小值} else {break; // 如果当前收益小于队列中的最小值,则不添加 当前的这个值}}pq.add(m); // 将当前收益添加到队列中m -= d;}}// 计算出优先队列中所有收益的总和return pq.stream().reduce(Integer::sum).orElse(0);}
}

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

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

相关文章

C# AOP面向切面编程

AOP&#xff08;Aspect-Oriented Programming&#xff0c;面向切面编程&#xff09;是一种编程范式&#xff0c;旨在将横切关注点&#xff08;Cross-cutting Concerns&#xff09;从业务逻辑中分离出来。在传统的面向对象编程中&#xff0c;横切关注点&#xff08;如日志记录、…

R包:蛋白质组学质控评估PTXQC包

介绍 PTXQC包是2016年发表在J Proteome Res期刊上的R包&#xff0c;它主要是对MaxQuant输出结果进行提取处理从而获得评估蛋白质质量结果。 安装 从github安装&#xff0c;安装过程会自动构建tutorial。 devtools::install_github("cbielow/PTXQC", build_vignet…

AI数字人直播saas系统源码部署火爆!无人直播系统全攻略

随着直播行业的日益兴盛&#xff0c;各种直播模式和玩法不断涌现。其中&#xff0c;AI数字人直播更是凭借着其在降本增效的独特优势而在众多直播模式中脱颖而出&#xff0c;成为了众多企业已经引进或计划引进的新型技术。而各大数字人源码厂商推出的AI数字人直播saas系统源码部…

面试题07-09

知道了 InnoDB 的索引实现后&#xff0c;就很容易明白为什么不建议使用过长的字段作为主键&#xff0c;因为所有辅助索引都引用主索引&#xff0c;过长的主索引会令辅助索引变得过大。再例如&#xff0c;用非单调的字段作为主键在 InnoDB 中不是个好主意&#xff0c;因为 InnoD…

走拼箱货必看海运拼箱的实用技巧

在国际海运运输中&#xff0c;海运拼箱适用于货物数量较少或体积不足以填满整个集装箱的情况。 海运拼箱货物通常由物流公司或货代进行组织和管理。多个货主的货物通过合理拼装&#xff0c;使集装箱空间得到充分利用。 那么&#xff0c;在海运拼箱和整柜有哪些不同&#xff0c…

Linux -- 认识gcc/g++、代码的编译过程

目录 前言&#xff1a; 使用 gcc/g&#xff1a; 代码的编译过程&#xff1a; 预处理&#xff1a; 头文件展开&#xff1a; 宏替换去注释&#xff1a; ​编辑 条件编译&#xff1a; 编译&#xff1a; 汇编&#xff1a; 链接&#xff1a; 动态库&#xff08;动态链…

使用Simulink基于模型设计(二):系统定义和布局

Simulink模型的顶层系统布局是许多工程团队可以使用的公共环境&#xff0c;是基于模型的设计范式&#xff1a;分析、设计、检验和实现。您可以通过确定模型的结构和各个组件来定义顶层系统。然后&#xff0c;您可以将模型按照层次结构进行组织&#xff0c;分别与系统的各个组件…

【鸿蒙学习笔记】交互事件

官方文档&#xff1a;交互事件 目录标题 分类交互事件-触屏交互事件-手势事件单一手势 分类 交互事件-触屏 在组件上按下(Down) , 滑动(Move) , 抬起(up)时触发的回调事件。包括点击事件、触摸事件和拖拽事件 交互事件-手势事件 在手机上点击打开应用 , 长按后拖动应用 , 这…

自动化数据集成的BI工具,为你提供决策洞察力

传统的商业智能&#xff08;BI&#xff09;报表系统采用的是“业务提报表需求&#xff0c;IT进行开发”的模式。决策管理者和业务人员提出用报表等来展示经营管理数据的需求&#xff1b;接着IT响应需求&#xff0c;进行需求沟通、数据处理加工、报表开发等主体工作&#xff1b;…

使用java代码取本月第一个工作日

根据参数或当前月&#xff0c;获取本月第一个工作日 文章目录 根据参数或当前月&#xff0c;获取本月第一个工作日前言一、根据当前日期获取当前月的第一个工作日二、根据参数日期&#xff0c;获取参数月的第一个工作日。总结 前言 这里我们列举两个方法&#xff1a; 1、没有参…

RFID资产管理系统 RFID固定资产管理系统

大多数企业都曾被固定资产管理“难”的问题困扰&#xff1a;账物不符、查询不便、盘点耗时……因此&#xff0c;越来越多的企业选择用资产管理系统&#xff0c;来实现资产智能化管理。 RFID资产管理系统方案是针对大多数企业存在的资产管理痛点&#xff0c;采用RFID技术&#…

uni-app三部曲之三: 路由拦截

1.引言 路由拦截&#xff0c;个人理解就是在页面跳转的时候&#xff0c;增加一级拦截器&#xff0c;实现一些自定义的功能&#xff0c;其中最重要的就是判断跳转的页面是否需要登录后查看&#xff0c;如果需要登录后查看且此时系统并未登录&#xff0c;就需要跳转到登录页&…

Python地震波逆问题解构算法复杂信号分析

&#x1f3af;要点 &#x1f3af;时域、时频域以及时间和频率相关联偏振特性分析三种算法 | &#x1f3af;时域波参数估计算法 | &#x1f3af;机器学习模型波形指纹分析算法 | &#x1f3af;色散曲线和频率相关波分析算法 | &#x1f3af;动态倾斜校正算法 | &#x1f3af;声…

【JS|第21期】JavaScript模块化:深入解析三种文件暴露方式

日期:2024年7月6日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083…

前后端项目部署方案汇总

前端项目 1、本地打包部署 # 本地打包部署到线上服务器 npm run build && \ rsync -r ./dist/* root127.0.0.1:/www/www.demo.com/www2、服务器端打包部署 步骤 拉取代码 -> 安装依赖 -> 打包编译 -> 拷贝到运行目录 -> 发送成功消息shell命令 git pu…

新手小白报考学习PMP会遇到哪些“坑”?

PMP考试的陷阱实际上与其他大型证书考试差不多&#xff0c;主要是在选择培训机构和各种收费方面会遇到一些坑。 首先&#xff0c;并不是每个人都能经历这些坑&#xff0c;因为PMP考试有一定的门槛。 作为引进国外的考试&#xff0c;报名都有中英文之分&#xff0c;所以先来看…

STM32的 DMA(直接存储器访问) 详解

STM32的DMA&#xff08;Direct Memory Access&#xff0c;直接存储器存取&#xff09;是一种在单片机中用于高效实现数据传输的技术。它允许外设设备直接访问RAM&#xff0c;不需要CPU的干预&#xff0c;从而释放CPU资源&#xff0c;提高CPU工作效率&#xff0c;本文基于STM32F…

[极客大挑战 2019]RCE ME

[极客大挑战 2019]RCE ME <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("This is too Long.");}if(preg_match("/[A-Za-z0-9]/",$code)){die("NO.");}eval($code); } else{highlight_f…

(附源码)c#+winform实现远程开机(广域网可用)

实现逻辑 利用UDP协议发送特定格式的魔术包&#xff0c;以远程唤醒具有特定MAC地址的目标计算机。目标计算机的BIOS和网络配置需要支持Wake-on-LAN&#xff08;WOL&#xff09;功能&#xff0c;并且需要在目标计算机上配置正确的网络唤醒设置。 源码在最后 准备工作 进入Bio…

力学有限元的基石:虚功原理的推导

推导虚功方程的过程 弹性力学的平衡方程 在张量形式中&#xff0c;平衡方程为&#xff1a; ∇ ⋅ σ b 0 \nabla \cdot \sigma b 0 ∇⋅σb0 用下标表示为&#xff1a; ∂ σ i j ∂ x j b i 0 \frac{\partial \sigma_{ij}}{\partial x_j} b_i 0 ∂xj​∂σij​​b…