蓝桥杯刷题019——观光公交(贪心)

news2025/1/11 11:15:53

题目描述

风景迷人的小城 Y 市,拥有 n 个美丽的景点。由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务。观光公交车在第 0 分钟出现在 1 号景点,随后依次前往 2、3、4……n 号景点从第 i 号景点开到第 i+1 号景点需要 D_i​ 分钟。任意时刻,公交车只能往前开,或在景点处等待。

设共有 m 个游客,每位游客需要乘车 1 次从一个景点到达另一个景点,第 i 位游客在Ti​ 分钟来到景点 Ai​,希望乘车前往景点 Bi​(Ai​≤Bi​)。为了使所有乘客都能顺利到达目的地,公交车在每站都必须等待需要从该景点出发的所有乘客都上车后才能出发开往下一景点。假设乘客上下车不需要时间

一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻。因为只有一辆观光车,有时候还要停下来等其他乘客,乘客们纷纷抱怨旅行时间太长了。于是聪明的司机 Z 给公交车安装了 k 个氮气加速器,每使用一个加速器,可以使其中一个D_i 减 1。对于同一个 D_i可以重复使用加速器,但是必须保证使用后 D_i大于等于 0。

那么 Z 该如何安排使用加速器,才能使所有乘客的旅行时间总和最小

输入描述

第 1 行是 3 个整数 n,m,k,每两个整数之间用一个空格隔开。分别表示景点数、乘客数和氮气加速器个数

第 2 行是 n−1 个整数,每两个整数之间用一个空格隔开,第 i 个数表示从第 i 个景点开往第 i+1 个景点所需要的时间,即 D_i

第 3 行至 m+2 行每行 3 个整数 Ti​,Ai​,Bi​,每两个整数之间用一个空格隔开。第 i+2 行表示第 i 位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。

其中,1≤n≤1000,1≤m≤10^4,0≤k≤10^5,1≤Di​≤100,0≤Ti​≤10^5

输出描述

输出共一行,包含一个整数,表示最小的总旅行时间。

输入输出样例

示例

输入

3 3 2
1 4
0 1 3
1 1 2
5 2 3

输出

10

样例说明

对 D_2 使用 2 个加速器,从 2 号景点到 3 号景点时间变为 2 分钟。 公交车在第 1 分钟从 1 号景点出发,第 2 分钟到达 2 号景点,第 5 分钟从 2 号景点出发,第 7 分钟到达 3 号景点。 第 1 个旅客旅行时间 7-0 = 7 分钟。 第 2 个旅客旅行时间 2-1 = 1 分钟。 第 3 个旅客旅行时间 7-5 = 2 分钟。 总时间 7+1+2 = 10 分钟。

题目大意:
有n个景点和m个游客,每个游客会在不同时间来到某个景点,想去另一个景点,公车可以使用k个加速器,求所有旅客最少的旅行时间。
题目限制条件:
1、公车到达某一景点时,需要等待所有从此处上车的游客,才能继续发车。
2、每个加速器可使到达景区的时间D_i减一,但只能在D_i>0时使用。


思考

1、先不考虑k个加速器,如何计算所有游客的旅行总时间?

定义一些数据:

  • come_last[ N]:记录每个景点,游客到齐的时间(即在该景点最后一个游客上车的时间)

游客到齐的时间:之前最晚到的游客和新来到的游客之间取最晚的

对应代码:come_last[a[i]] = max(come_last[a[i]], t[i])

  • arrive_at[ N]:记录每个景点,公车到达的时间

每个景点,公车到达的时间有两种情况:(看上一个景点的情况)

1、上一个景点车先到就等游客到齐,公车到达的时间:come_last[i - 1] + d[i - 1]

2、上一个景点游客先到齐就等车到,公车到达的时间:arrive[i - 1] + d[i - 1]。

两者最晚的就是第i景点的公车到达时间,即二者取最大值。

 对应代码arrive[i] = max(arrive[i - 1], come_last[i - 1]) + d[i - 1]

  • get_off[N]:记录每个景点下车的游客数

get_off[b[i]] += 1:到达的景点bi处下车,下车的游客数+1

arrive[b[i]] - t[i]:每个游客的旅行时间

  • d[N]:d[i]表示i号景点到i+1号景点所需要的时间
  • t[M], a[M], b[M]:分别记录每个游客的到来时间,起始景点和目标景点

2、k个加速器如何使用?

题目:一个乘客的旅行时间,等于他到达目的地的时刻减去他来到出发地的时刻  

只有当加速器可以使得游客的旅行时间减少,才是有效的。
每个加速器,都选择在能够影响最多游客的地方使用,根据贪心思想,这样可以最大化减少总时间。

benefit[N]:记录在每个景点使用加速器,能够影响的游客数量
找出benefit的最大值对应得景点,就是使用当前加速器的位置

使用一个加速器,车上的人提前一分钟到达,但当车到达时,游客还没有到齐(如左图),导致未上车的游客不能享受到提前一分钟上车(到达目的地),不能最大化。只有当车到达前游客到齐(如右图),未上车的游客才能减少这一分钟,当最多人旅行时间减少时才能得到benefit的最大值。

benefit[N]的求解

最后一个景点倒序往前计算
在i-1景点处使用加速器,那么至少i景点下车的游客将减少旅行时间:benefit[i-1]=get_off[i],若游客在i景点到齐但公车晚到(arrive_at[i]>come_last[i]),那在i-1景点使用加速器,后面一个景点,等待的和车上的旅客都将减少旅行时间:benefit[i-1]+=benefit[i]

结果的计算

求出benefit后,找出里面的最大值,其下标p就是我们使用加速器的位置(这个位置的d不能是0)
由于di发生改变,因此需要循环n次重新计算arrive_at数组
上述过程需要循环k次,完成k个加速器的使用
完成后,计算所有游客现在的旅行总时间即为结果
时间复杂度:O(nk)

代码

n, m, k = map(int, input().split())
N = 1010; M = 10010
come_last = [0] * N             # 记录每个景点,公车到达的时间
arrive = [0] * N                # 记录每个景点,公车到达的时间
get_off = [0] * N               # 记录每个景点下车的游客数

t = [0] * M; a = [0] * M; b = [0] * M        # 分别记录每个游客的到来时间,起始景点和目标景点
d = [0] + list(map(int, input().split())) + [0]  # i号景点到i+1号景点的所需要的时间,最后加个0是保证氮气加速器部分不会越界
for i in range(m):
    t[i], a[i], b[i] = map(int, input().split())
    come_last[a[i]] = max(come_last[a[i]], t[i])
    get_off[b[i]] += 1

for i in range(1, n + 1):
    arrive[i] = max(arrive[i - 1], come_last[i - 1]) + d[i - 1]


benefit = [0] * N                    # 存储每个景点减少时间人数最多的人数
while k:
    for i in range(n, 1, -1):
        benefit[i - 1] = get_off[i]         #在i-1位置使用1个加速器,就能让i景点下车的乘客减少时间
        if arrive[i] > come_last[i]:
            benefit[i - 1] += benefit[i]    #在i-1位置使用1个加速器,后边下车的乘客都能减少时间
    p = 1
    for i in range(1, n + 1):
        if d[i] and benefit[i] > benefit[p]:    # 时间>0且当前景点p减少时间的人数更多
            p = i
    d[p] -= 1                                   # 在减少时间最多人数的景点p使用加速器
    for i in range(1, n + 1):
        arrive[i] = max(arrive[i - 1], come_last[i - 1]) + d[i - 1] # d改变了,所以重新计算到达时间
    k -= 1                                      # 加速器-1

# 求所有旅客的旅行时间   range(m): arrive[b[i]] - t[i]
res = 0
for i in range(m):
    res += arrive[b[i]] - t[i]
print(res)

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

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

相关文章

使用Workbook读取表格问题总结

使用Workbook读取表格问题总结一、Workbook类型二、问题总结1.SXSSFWorkbook为什么我Create了一万行Row但是却获取不到?2.读取表格一、Workbook类型 Workbook分三种类型: 1.HSSFWorkbook 用于Excel2003版及更早版本(扩展名为.xls)的导出; 2.…

苹果手机备忘录密码忘记了怎么办?快速解锁,亲测有效

很多小伙伴喜欢使用苹果手机的备忘录来记录重要的事情,并且还会给备忘录设置密码。可是使用的时间长了,就忘记了自己备忘录密码了。苹果手机备忘录密码忘记了怎么办?别担心,今天小编分享一个亲测有效的方法,快来看看吧…

纳瓦电子前向77GHz毫米波雷达获国内新能源头部车企定点!

伴随着中国自主品牌新车搭载ADAS功能的高速增长,中国本土毫米波雷达供应商迎来了前所未有的机遇期。 高工智能汽车研究院监测数据显示,今年1-11月中国市场(不含进出口)乘用车前装标配搭载前向毫米波雷达交付上险755.53万颗&#…

一站式开发平台 赋能办公全场景

近几年,数字化办公迎来了新的机遇,根据亿欧智库《2022中国数字化办公市场研究报告》推算,数字化办公2021年的市场规模达到973.89亿元,至2025年将达到1768.16亿元,整体增速保持平稳,2018-2025年的CAGR为15.8…

写IB EE(Extended Essay)时容易犯的五大错误

EE的重要性无需多言,EE和TOK一共占IB45分总分的3分,其中一门拿到E的话,就会fail,拿不到IB的diploma。虽说和学校老师会有meeting讨论的机会,但时间有限,提供的精准指导也有限。EE的要求很严谨,很…

基于java SSM springboot动物检疫信息管理系统设计和实现

基于java SSM springboot动物检疫信息管理系统设计和实现 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获…

Java集合(八)Map接口

我们来查看Map接口: 里面的k-v和set集合的不同之处在于:key仍然是一个对象,但是对于set来说value是一个常量, private static final Object PRESENT new Object(); set里面的value放的是 静态性质的PRESENT。 而map的value是自…

Issue—C#—ssl相关错误

报错:.net 6 : {"MessageTemplate": "An unhandled exception has occurred while executing the request.""Exception": "System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exc…

函数(基础)

目录 一、字符串函数 (一)常用的字符串函数 (二)举例 1. concat(拼接) 2. Lower(大写变小写) 3. upper(小写变大写) 4. lpad(左填充) 5. rpad(右填充) 6. trim(去掉前后空格) 7. ltrim(去掉左边…

Linux-远程管理命令

1.关机/重启序号命令对应英文作用01shutdown 选项 时间shutdown关机/重新启动1.1shutdownshutdown命令可以安全关闭或者重新启动系统选项含义-r重新启动提示:不指定选项和参数,默认表示1分钟之后关闭电脑远程维护服务器时,最好不要关闭系统&a…

Centos7 U盘 安装

目录 一 描述环境 二 下载镜像 2.1 阿里云下载地址: 2.2 Centos 下载: 三 制作U盘启动盘 3.1 下载软碟通 最新UltraISO官方免费下载 - UltraISO软碟通中文官方网站下载https://cn.ultraiso.net/xiazai.html 3.2 傻瓜安装即可(不赘述) 3.3…

怎么移除css的hover事件

移除css hover事件的方法:1、;通过“$("a").hover(function(){ alert(mouseover); }, function(){ alert(mouseout); })”方法绑定hover事件;2、通过“$(a).off(mouseenter).unbind(mouseleave);”方法取消绑定的hover事件即可。 j…

Filesystem closed报错问题处理

使用HDFS的时候 final Configuration conf new Configuration(); final FileSystem fs FileSystem.get(URI.create(hdfsFile), conf); final Path path new Path(hdfsFile); if (fs.exists(path)) {final FSDataInputStream is fs.open(path);final FileStatus stat fs.g…

一文细说OpenCL框架

说明: 子曾经曰过:不懂Middleware的系统软件工程师,不是一个好码农; 1. 介绍 OpenCL(Open Computing Language,开放计算语言):从软件视角看,它是用于异构平台编程的框架&#xff1b…

华为OD测试岗面经,一周走完面试流程

一周走完面试流程,10.18 机考,机试210 第一题:【最大N个数与最小N个数的和】 第二题:拼接URL 第三题:跳格子 性格测试:题目比较多,有一百多道,在三个选项中选出一个最符合的和一个最不符合的。答题的时候以…

C++:string模拟实现(下)

目录 一.引言 二.string类的容量操作接口 三.string类的字符串修改操作接口 1.两个插入字符的重载函数: 2.在string字符串末尾追加内容的接口 3.在指定位置pos删除n个字符的接口 四.string类字符串的字符和子串查找接口 五.全局定义的string类字符串比较运算…

SSM项目-小说网站

目录 设计目标 需求分析 网站主页 用户注册 1、需求分析 2、数据库设计 3、生成验证码 4、数据加密 1、MD5 2、BCrypt加密 5、数据交换格式 用户登录 找回密码 新用户注册 邮件发送 检测登录状态 书架功能 查看书架 添加书籍进入书架 删除书架上的书籍 获…

kafka在zookeeper中存储结构

1、存储结构图 2、ZooKeeper命令 ZooKeeper -server host:port cmd args stat path [watch] set path data [version] ls path [watch] delquota [-n|-b] path ls2 path [watch] setAcl path acl setquota -n|-b val…

Verticle-align

1.verticle-align的官方解释及所产生的疑问 1.1 vertical-align的官方解释 vertical-align会影响 行内块级元素 在一个 行盒 中垂直方向的位置 【这里有重点词汇,一个行盒,行内块元素,为什么不包括块元素呢,因为块元素是独占一行…

TOP10:餐饮店设计排行榜(2023年最新排名)

随着我国经济不断的高速发展,自13年以来,大众化餐饮市场呈现良好发展趋势,已由13年的2.64万亿增长到3.96万亿,增长率为10.7%,预计2017年到2022年增长速度为9.9%,达到6.28万亿。其中中餐主题餐饮占比维持在8…