Python:每日一题之观光公交(前缀和)

news/2024/7/7 20:46:59

题目描述

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

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

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

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

输入描述

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

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

第 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

说明

对 D2​ 使用 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 分钟。

思路:

【分析】 —— 在第 i 站使用加速器
        1、到达 i+1 站的时间小于以 i+1 站为起点的乘客到达 i+1站最晚的时间;
        2、观光车到达 i+1 的时间等于以 i+1 站为起点的乘客到达i+1站最晚的时间;
        3、观光车到达 i+1 的时间大于以 i+1 站为起点的乘客到达i+1 站最晚的时间;

参考代码:

前缀和(只能通过80%)

n,m,k = [int(i) for i in input().split()]
d = [int(i) for i in input().split()] #旅途时间
tim = [0 for _ in range(m)]  #到达起始站时刻
st = [0 for _ in range(m)]   #起始车站
nd = [0 for _ in range(m)]   #终点车站
las = [0 for _ in range(n)]  #最后到达的时间
sum = [0 for _ in range(n)]  #i号节点下车人数
go = [0 for _ in range(n)]   #到车时间
rang = [0 for _ in range(n)] #影响范围
tot = 0
for i in range(m):
    tim[i],st[i],nd[i] = [int(i) for i in input().split()]
    st[i], nd[i] = st[i]-1,nd[i]-1
    las[st[i]] = max(las[st[i]],tim[i])
    sum[nd[i]] +=1      
for i in range(1,n):
    sum[i]+=sum[i-1] #前缀和
    go[i]=max(go[i-1],las[i-1])+d[i-1]
for i in range(m):
    tot += go[nd[i]] - tim[i]  #终点-到达时间
while k:
    k-=1
    rang[n-2] = n-1
    for i in range(n-3,-1,-1):
        if go[i+1]<=las[i+1]:
            rang[i] = i + 1
        else:
            rang[i] = rang[i + 1]
    mx = 0
    id = 0
    for i in range(n-1):
        now = sum[rang[i]]-sum[i]
        if mx<now and d[i]:
            mx = now
            id = i
    if mx == 0:
        break
    tot -= mx
    d[id]-= 1
    for i in range(id,rang[id]+1):
        go[i]=max(go[i-1],las[i-1])+d[i-1]
print(tot)


http://lihuaxi.xjx100.cn/news/836910.html

相关文章

Linux设置开机自启keepalived+nginx服务

目录&#xff1a; 目录 背景&#xff1a; 分析过程&#xff1a; 解决方案&#xff1a; 解决方案一&#xff1a; 解决方案二&#xff1a; 背景&#xff1a; 在工作突发遇见了Linux虚拟机所在的宿主机重启了&#xff0c;虚拟机上部署nginxkeepalived服务&#xff0c;但是…

Hudi(21):Hudi集成Flink之核心原理分析

目录 0. 相关文章链接 1. 数据去重原理 1.1. 消息版本新旧 1.2. 攒消息阶段的去重 1.3. 写 parquet 增量消息的去重 1.4. 跨 partition 的消息去重 2. 表写入原理 2.1. 数据写入分析 2.2. 数据压缩 2.3. 数据清理 2.4. Job图 3. 表读取原理 0. 相关文章链接 Hudi文…

Hadoop三大框架

一、Hadoop是什么Hadoop是一个由apache开发的分布式系统基础架构。主要解决海量数据的存储和海量数据的分析计算问题。广义上来说&#xff0c;Hadoop通胀指一个更宽泛的概念——Hadoop生态圈1、Hadoop优势高可靠性&#xff1a;Hadoop底层维护多个数据副本&#xff0c;即使Hadoo…

es-Mapping

文章目录es-Mapping概念查看mappingES数据类型两种映射类型映射参数es-Mapping 概念&#xff1a;映射是定义文档及其包含的字段的存储和索引方式的过程两种映射方式 dynamic mapping&#xff08;动态映射或自动映射&#xff09;expllcit mapping &#xff08;静态映射或手动映…

java商城源码_java 多商户商城系统源码分享

三勾商城多商户是开发友好的微信小程序商城&#xff0c;框架支持SAAS&#xff0c;支持发布 iOS Android 公众号 H5 各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉/淘宝&#xff09;等多个平台&#xff0c;不可多得的二开神器&#xff0c; 为大中小企业提供极致的移…

超详细的JAVA高级进阶基础知识01

目录 1. 面向对象高级01 1.1 static 关键字 1.1.1 static 关键字的介绍 1.1.2 static 修饰成员的特点 1.1.3 static 关键字总结 1.2 继承 1.2.1 继承介绍 1.2.2 继承 - 学习路径 1.2.3 继承中的成员访问特点 - 成员变量 1.2.4 继承中的成员访问特点 - 成员方法 1.…

互联网摸鱼日报(2023-02-08)

互联网摸鱼日报&#xff08;2023-02-08&#xff09; InfoQ 热门话题 “赋能制造 因你而耀”第六届全国工业互联网数据创新应用大赛算法赛题上新&#xff01; 全球化安全生产 & 质量保障体系建设探索 B2B跨境支付平台XTransfer的质量保障体系建设之路&#xff1a;测试的左…

Cannot read property ‘getDisplayMedia‘ of undefined

文章目录一、问题出现原因二、解决方法方法一&#xff1a;方法二&#xff1a;三、其他注意事项今天在把项目部署到服务器上的时候&#xff0c;突然发现直播功能失效了&#xff0c;在本地跑是没有问题的&#xff0c;找了半天终于知道是什么原因了&#xff0c;即 Cannot read pro…