【2024最新华为OD-C/D卷试题汇总】[支持在线评测] LYA的巡演(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📎在线评测链接

https://app5938.acapp.acwing.com.cn/contest/2/problem/OD1073
🌍 评测功能需要 ⇒ 订阅专栏 ⇐ 后私信联系清隆解锁~

🍓OJ题目截图

在这里插入图片描述

文章目录

    • 📎在线评测链接
    • 🍓OJ题目截图
    • LYA的巡演
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例解释
      • 数据范围
      • 题解
      • 题解
      • 参考代码

LYA的巡演

题目描述

LYA是一位歌手,她计划从 A A A 城市出发,在 T T T 天内到达 B B B 城市参加演出。途中,LYA会经过 N N N 座城市,每两座城市之间需要耗费一定的时间。LYA不能往回走,但可以在每座城市逗留卖唱赚钱。

LYA提前了解到,在一座城市卖唱第一天可以赚 M M M 元,之后每天的收入会减少 D D D 元,直到减为 0 0 0 为止。LYA只有在到达一座城市的第二天才能开始卖唱,如果当天卖过唱,就要等到第二天才能出发去下一座城市。

作为一位贪心的歌手,LYA希望在规定时间内赚到最多的钱。你能帮她算算最多能赚多少钱吗?

输入格式

第一行包含两个正整数 T T T N N N,分别表示总天数和途中经过的城市数量,满足 0 < T < 1000 0 < T < 1000 0<T<1000, 0 < N < 100 0 < N < 100 0<N<100

第二行包含 N + 1 N+1 N+1 个正整数,表示每两座城市之间需要耗费的时间,它们的总和不超过 T T T

接下来 N N N 行,每行包含两个正整数 M M M D D D,分别表示在对应城市卖唱第一天的收入和之后每天收入减少的值,满足 0 < M < 1000 0 < M < 1000 0<M<1000, 0 < D < 100 0 < D < 100 0<D<100

输出格式

输出一个整数,表示LYA最多能赚到的钱数。

样例输入

10 2
1 1 2
120 20
90 10

样例输出

540

样例解释

总共有 10 10 10 天时间,途中经过 2 2 2 座城市。从 A A A 城市到 B B B 城市共需要 1 + 1 + 2 = 4 1+1+2=4 1+1+2=4 天,剩余 6 6 6 天时间可以用来卖唱赚钱。最优方案是在第一座城市卖唱 3 3 3 天,在第二座城市卖唱 3 3 3 天。

在第一座城市可以赚 120 + 100 + 80 = 300 120+100+80=300 120+100+80=300 元,在第二座城市可以赚 90 + 80 + 70 = 240 90+80+70=240 90+80+70=240 元,总收入为 300 + 240 = 540 300+240=540 300+240=540 元。

数据范围

0 < T < 1000 0 < T < 1000 0<T<1000
0 < N < 100 0 < N < 100 0<N<100
0 < M < 1000 0 < M < 1000 0<M<1000
0 < D < 100 0 < D < 100 0<D<100

题解

抱歉,我的题解写得不够准确。根据之前给出的Python代码,这道题确实可以用贪心策略来解决。让我重新写一份题解:

题解

这道题可以使用贪心策略来解决。我们可以先计算出歌手总共有多少天可以用来卖唱赚钱,然后将每座城市每天的收入按从大到小排序,取前 k k k 大的值相加即可,其中 k k k 为可以卖唱的总天数。

具体步骤如下:

  1. 计算歌手总共可以卖唱的天数 k k k,即总天数 T T T 减去城市间移动需要的天数之和。
  2. 遍历每座城市,计算出在该城市卖唱每天的收入,直到收入减为 0 0 0,将所有的收入值加入数组 i n c o m e s incomes incomes
  3. 将数组 i n c o m e s incomes incomes 按照从大到小的顺序排序。
  4. 取排序后的数组 i n c o m e s incomes incomes 的前 k k k 个元素求和,即为歌手能赚到的最大收入。

为什么这样做是正确的呢?因为我们要在有限的天数内尽可能多地赚钱,所以应该优先选择每天收入最高的城市去卖唱。将所有城市的每天收入排序后,前 k k k 大的收入对应的就是歌手应该选择去卖唱的日子。

这样做的时间复杂度为 O ( N × max ⁡ ( M ) + k log ⁡ k ) O(N \times \max(M) + k \log k) O(N×max(M)+klogk),其中 N N N 为城市数量, M M M 为某座城市第一天卖唱的收入, k k k 为可以卖唱的总天数。排序的时间复杂度为 O ( k log ⁡ k ) O(k \log k) O(klogk),而遍历所有城市计算收入的时间复杂度为 O ( N × max ⁡ ( M ) ) O(N \times \max(M)) O(N×max(M))

这种贪心策略是最优的,因为它总是选择了当前收入最高的日子去卖唱,不会遗漏任何可能获得更多收入的机会。

参考代码

  • Python
total_days, n = map(int, input().split())
travel_days = sum(map(int, input().split()))
sing_days = total_days - travel_daysincomes = []
for _ in range(n):first_day, dec = map(int, input().split())cur_income = first_daywhile cur_income > 0:incomes.append(cur_income)cur_income -= decincomes.sort(reverse=True)
print(sum(incomes[:sing_days]))
  • Java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int totalDays = sc.nextInt();int n = sc.nextInt();int travelDays = 0;for (int i = 0; i < n + 1; i++) {travelDays += sc.nextInt();}int singDays = totalDays - travelDays;ArrayList<Integer> incomes = new ArrayList<>();for (int i = 0; i < n; i++) {int firstDay = sc.nextInt();int dec = sc.nextInt();int curIncome = firstDay;while (curIncome > 0) {incomes.add(curIncome);curIncome -= dec;}}Collections.sort(incomes, Collections.reverseOrder());int maxIncome = 0;for (int i = 0; i < singDays; i++) {maxIncome += incomes.get(i);}System.out.println(maxIncome);}
}
  • Cpp
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int main() {int totalDays, n;cin >> totalDays >> n;int travelDays = 0;for (int i = 0; i < n + 1; i++) {int d;cin >> d;travelDays += d;}int singDays = totalDays - travelDays;vector<int> incomes;for (int i = 0; i < n; i++) {int firstDay, dec;cin >> firstDay >> dec;int curIncome = firstDay;while (curIncome > 0) {incomes.push_back(curIncome);curIncome -= dec;}}sort(incomes.begin(), incomes.end(), greater<int>());int maxIncome = 0;for (int i = 0; i < singDays; i++) {maxIncome += incomes[i];}cout << maxIncome << endl;return 0;
}

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

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

相关文章

心明眼亮 洞悉万物

如何洞悉事物的本质呢&#xff1f; 阳明先生&#xff1a;世间之事&#xff0c;纷繁复杂&#xff0c;不可能一一研究得过来。 圣人只需要把内心的明镜擦亮&#xff0c;而无需担心外部的事事物物在镜子中如何映照。 —— 外界事物是无穷无尽的&#xff0c;永远探究不完&#xf…

30 - 每位经理的下属员工数量(高频 SQL 50 题基础版)

30 - 每位经理的下属员工数量 -- 根据reports_to &#xff0c;获取employee_id,即分组用e1.reports_to&#xff0c;查询用e2.employee_id,e2.nameselect e2.employee_id,e2.name ,count(e1.reports_to) reports_count,round(avg(e1.age),0) average_age from Employees e1 left…

【鸿蒙踩坑记录】解决:list组件滑动至左边或右边,回弹效果过大问题

一、问题描述 开发过程中使用List组件&#xff0c;当内容超过一屏时可出现滚动效果&#xff0c;此时按住内容迅速滑动至左边&#xff0c;或者滑动到右边&#xff0c;回弹效果过大 期望&#xff1a;滑动时&#xff0c;不要有那么大的回弹效果 二、目前效果 三、解决方法 3.1…

go语言day03

目录 一、 go语言的数据类型&#xff1a; 二、声明赋值的简写形式&#xff1a; ":" 1&#xff09;重复使用的编译错误 2&#xff09;在全局变量中使用 : 会报编译错误 三、变量规则&#xff1a; 0&#xff09;变量的命名规则&#xff1a; 1&#xff09;创建的局部…

丰臣秀吉-读书笔记六

登山的目标必然是山顶。但人生的乐趣和生息的快乐却不在山顶&#xff0c;相反可以说是在山中的逆境之处。当我们遇上峡谷、绝壁、溪流、断崖、雪崩之类的险路时&#xff0c;心里虽想着已经不行了等&#xff0c;却不甘就此罢手而不与面前的艰难险阻战斗。而当我们完美克服并跨越…

用 Rust 实现一个替代 WebSocket 的协议

很久之前我就对websocket颇有微词&#xff0c;它的确满足了很多情境下的需求&#xff0c;但是仍然有不少问题。对我来说&#xff0c;最大的一个问题是websocket的数据是明文传输的&#xff0c;这使得websocket的数据很容易遭到劫持和攻击。同时&#xff0c;WebSocket继承自HTTP…

Spark SQL 血缘解析方案

背景 项目背景建设数据中台,往往数据开发人员首先需要能够通过有效的途径检索到所需要的数据,然后根据检索的数据模型进行业务加工然后得到一些中间模型,最后再通过数据抽取工具或者OLAP分析工具直接将数据仓库中加工好的公共模型输出到应用层。这里我不在去介绍数据仓库为…

Mysql8死锁排查

Mysql8死锁排查 Mysql8 查询死锁的表 -- 查询死锁表select * from performance_schema.data_locks;-- 查询死锁等待时间select * from performance_schema.data_lock_waits;Mysql8之前的版本 查询死锁的表 -- 查询死锁表SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;-- 查询…

Virtualbox主机和虚拟机之间文件夹共享及双向拷贝

在VirtualBox这样的虚拟化环境中&#xff0c;实现主机与虚拟机之间的文件夹共享与双向文件传输是一个常见的需求。下面&#xff0c;我们将详细讲解如何在VirtualBox中实现这一功能。 一、安装与准备 首先&#xff0c;确保你已经安装了VirtualBox&#xff0c;并在其上成功创建…

最大乘积和-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第85讲。 最大乘积和&#…

kafka进阶核心原理详解:案例解析(第11天)

系列文章目录 kafka高级&#xff08;重点&#xff09; kafka核心概念汇总 kafka的数据位移offset Kafka的基准/压力测试 Kafka的分片副本机制 kafka如何保证数据不丢失 kafka的消息存储及查询机制 生产者数据分发策略 消费者负载均衡机制 kafka的监控工具:kafka-eagle…

关于application/x-www-form-urlencoded跟application/json请求的区别

当你的java方法是这样定义的 PostMapping("/rePushMedicalRecord") public String rePushMedicalRecord(RequestParam("topicId") String topicId){ } 参数是RequestParam接收&#xff0c;则请求时需要用application/x-www-form-urlencoded请求 如果是R…

ArcGIS消除碎图斑

​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 点击学习——>遥感影像综合处理4大遥感软件ArcGISENVIErdaseCognition 这次是上次 我们经常在相交、标识、更新等操作后或者是栅格转矢量可能存在很多的细碎图斑&#…

Golang三色标记法

简介 在JVM中&#xff0c;GC采用可达性分析法来判断对象是否死亡&#xff1b;在python虚拟机中&#xff0c;GC采用引用计数法加循环检测器来判断对象是否死亡&#xff0c;而在golang中&#xff0c;使用的是三色表记法来判断对象是否死亡。 什么是三色抽象 总所周知在GC时&am…

基于JSP技术的家用电器销售网站

开头语&#xff1a;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;文末可以找到我的联系方式。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSPJava 工具&#xff1a;ECLIPSE、MySQL数据库管理工具、Tomcat 系统展…

【字符串 状态机动态规划】1320. 二指输入的的最小距离

本文涉及知识点 动态规划汇总 字符串 状态机动态规划 LeetCode1320. 二指输入的的最小距离 二指输入法定制键盘在 X-Y 平面上的布局如上图所示&#xff0c;其中每个大写英文字母都位于某个坐标处。 例如字母 A 位于坐标 (0,0)&#xff0c;字母 B 位于坐标 (0,1)&#xff0…

国企:2024年6月中国移动相关招聘信息

中国移动研究院: AI中心-大模型数据工程师 工作地点:北京市、西安市2 发布时间 :2024-06-18 学历要求:硕士研究生及以上 招聘人数:招聘若干人 专业要求 计算机、人工智能、软件工程、数学等相关专业 工作职责 1、负责处理和清洗大规模、多来源的数据集,保证数…

【开源节流】如何通过数字化转型增强盈利能力?

引言&#xff1a;随着市场竞争的日益激烈&#xff0c;新技术发展的推动和企业发展的需求等&#xff0c;这些背景因素共同促使企业加快数字化转型步伐&#xff0c;以适应市场变化、提升竞争力并实现可持续发展。那如何通过如何通过数字化转型增强盈利能力&#xff1f;需要通过开…

港湾周评|高盛眼中的618增长

《港湾商业观察》李镭 年中最重要的购物节618终于尘埃落定了。2024年的618各大电商平台竞技情况如何&#xff1f;又有哪些新的亮点&#xff1f;都成为外界观察消费行为的参考指标。 根据京东618数据显示&#xff1a;累计成交额过10亿的品牌83个&#xff0c;超15万个中小商家销…

jsp-curd+分页倒导航案例

效果图 <!DOCTYPE html> <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <html lang"en"> <head><meta charset"UTF-8"><title>学生管理</…