观光公交

【问题描述】 

风景迷人的小城 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 该如何安排使用加速器,才能使所有乘客的旅行时间总和最小?

 

【输入】

 输入文件名为bus.in。

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

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

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

 

【输出】

 输出文件名为bus.out。共一行,包含一个整数,表示最小的总旅行时间。

 

【输入输出样例】        

bus.in

bus.out 

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 分钟。

【数据范围】

对于 10%的数据,k=0;  对于 20%的数据,k=1;

 对于 40%的数据,2≤ n≤ 50,1≤ m≤ 1,000,0≤ k≤ 20,0≤ Di ≤ 10,0≤ Ti ≤ 500;

 对于 60%的数据,1≤ n≤ 100,1≤ m≤ 1,000,0≤ k≤ 100,0≤ Di ≤ 100,0≤ Ti ≤ 10,000;对于 100%的数据,1 ≤ n ≤ 1,000,1 ≤ m ≤ 10,000,0 ≤ k ≤ 100,000,0 ≤ Di ≤ 100,

0≤ Ti ≤ 100,000。


 思路:

一道有意思的贪心~

 

解析代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std ;
const int maxn=1005,maxm=10005;int n,m,ans,k;
int lat[maxn],from[maxn],arr[maxn],down[maxn];struct node{int val,tim,l,r;
};struct cmp{inline bool operator ()(node ax,node bx){return ax.val<bx.val;}
};priority_queue<node,vector<node>,cmp>q;struct Node{int y,t;
}a[maxm];void work(int l,int r){if(l>=r) return;if(!from[l]){                    //不花时间?下一个 work(l+1,r);return;}for(int i=l+1;i<r;i++) if(lat[i]>=arr[i]){         //拆分可减速的分段 
            work(l,i),work(i,r);return;}int minn=from[l],val=down[r];   // minn: l 到 l+1 的距离 ,val: r点下车的总人数 for(int i=1+l;i<r;i++) minn=min(minn,arr[i]-lat[i]),val+=down[i]; //找到最优下车所减时间 from[l]-=minn;   //更新 for(int i=1+l;i<r;i++) arr[i]-=minn; //更新 
    q.push((node){val,minn,l,r});  
}int main()
{scanf("%d%d%d",&n,&m,&k);                  // n 站,m 乘客,2 加速 for(int i=1;i<n;i++) scanf("%d",&from[i]); // i -> i+1 的距离 for(int i=1,x;i<=m;i++){                scanf("%d%d%d",&a[i].t,&x,&a[i].y);    // a[i].t 乘客到站时间,从 x 站,到 a[i].ylat[x]=max(a[i].t,lat[x]);             // 从 x 点出发的时间:lat[x]ans-=a[i].t;                           // ans - 起始时间down[a[i].y]++;                        // 终点下车人数
    }for(int i=1;i<n;i++) arr[i+1]=max(arr[i],lat[i])+from[i]; // 更新到站的时间for(int i=2;i<=n;i++) ans+=down[i]*arr[i];                // ans + 到达终点的时间 work(1,n);while(!q.empty() && k)    {node x=q.top();q.pop();ans-=x.val*min(x.tim,k);k-=min(x.tim,k);if(k) work(x.l,x.r); //看能不能再减 
    }printf("%d\n",ans);return 0;
}
/* 
3 3 2 
1 4 
0 1 3 
1 1 2 
5 2 3 
*/  

 

转载于:https://www.cnblogs.com/qseer/p/9600184.html

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

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

相关文章

linux行命令测网速,Linux命令行测试网速的方法

最近给服务器调整了互联网带宽的限速策略&#xff0c;调到100M让自己网站也爽一下。一般在windows上我喜欢用speedtest.net来测试&#xff0c;测速结果也被大家认可。在linux上speedtest.net提供了一个命令行工具speedtest-cli&#xff0c;用起来很方便&#xff0c;这里分享一下…

Delphi XE2获取汉字拼音首字母

function CnPYIndex(const CnString: string): string;{ 返回中文的拼音首字母}const ChinaCode: array[0..25, 0..1] of Integer ((1601, 1636), (1637, 1832), (1833, 2077), (2078, 2273), (2274, 2301), (2302, 2432), (2433, 2593), (2594, 2786), (9999, 0000), …

图像处理傅里叶变换图像变化_傅里叶变换和图像床单视图。

图像处理傅里叶变换图像变化What do Fourier Transforms do? What do the Fourier modes represent? Why are Fourier Transforms notoriously popular for data compression? These are the questions this article aims to address using an interesting analogy to repre…

HDUOJ 1062 TEXT REVERSE

#include<iostream> #include<stdlib.h> #include <iomanip> #include<stack> using namespace std;int main(){//次数int n 0;while (cin >> n) {//这里需要读一个字符&#xff0c;需要消除换行符的影响getchar();while (n--) {char c;stack&l…

VC++的windows服务

项目建立&#xff1a; VS2008->ATL项目->服务exe 服务部署&#xff1a; 在VS2008中新建的ATL项目&#xff0c;在网上看到的流程中都会有注册服务这一项。 但是对服务的注册都是只给了一个指令&#xff0c;一句话带过&#xff0c;没有给出具体的操作步骤 经过多次试验…

linux中gradle编译慢,【Linux】解决linux下android studio用gradle构建从jcenter或maven下载依赖太慢...

一个简单的办法&#xff0c;修改项目根目录下的build.gradle&#xff0c;将jcenter()或者mavenCentral()替换掉即可&#xff1a;allprojects {repositories {maven{ url http://maven.oschina.net/content/groups/public/}}}但如果你有很多个项目的话&#xff0c;一个一个的改估…

MFC程序需要的函数库及头文件--《深入浅出MFC》

Windows程序调用的函数可分为2部分&#xff1a;C Runtimes Windows API。 C Runtimes&#xff1a; LIBC.LIB -- C Runtime函数库的静态链接版本 MSVSRT.LIB--C Runtime库的动态链接版本&#xff08;如果要链接这一函数&#xff0c;你的程序执行时必须有MSVCRT40.DLL在场&#…

C#DNS域名解析工具(DnsLookup)

C#DNS域名解析工具(DnsLookup) DNS域名解析工具&#xff1a;DnsLookup 输入域名后点击Resolve按钮即可。 主要实现代码如下&#xff1a; private void btnResolve_Click ( object sender, EventArgs e ) {lstIPs.Items.Clear ( ); //首先把结果里的ListBox清空 try {IPHostE…

python.day05

一 字典 定义:dict, 以{},表示.每一项用逗号隔开,内部元素用key:value的形式来保存数据.例如 {"jj":"林俊杰","jay:周杰伦"} 特点:查询效率非常高,通过key来查找元素 内部使用key来计算一个内存地址(暂时),hash算法,key必须不可变的数据类型(ke…

滞后分析rstudio_使用RStudio进行A / B测试分析

滞后分析rstudioThe purpose of this article is to provide some guide on how to conduct analysis of a sample scenario A/B test results using R, evaluate the results and draw conclusions based on the analysis.本文的目的是提供一些指南&#xff0c;说明如何使用R对…

Linux程序实现弹框,jQuery实现弹出框 效果绝对美观

使用到JQeury写的几个比较好的Popup DialogBox,觉得不错。和大家分享下。使用它们结合.net可以实现很好的效果。1.jqpopup:是个可以拖拽,缩放并可以在它上面显示html页面上任何一个控件组合的控件。可以和后面的主页面通信。使用方法:先调用这几个js文件,可以自提供的下载地址下…

Interesting visualization tools for profiling.

Interesting visualization tools for profiling. http://dtrace.org/blogs/brendan/2012/03/17/linux-kernel-performance-flame-graphs/ http://dtrace.org/blogs/brendan/2013/07/01/detecting-outliers/

MySQL的事务-原子性

MySQL的事务处理具有ACID的特性&#xff0c;即原子性&#xff08;Atomicity)、一致性&#xff08;Consistency&#xff09;、隔离性&#xff08;Isolation&#xff09;和持久性&#xff08;Durability&#xff09;。 1. 原子性指的是事务中所有操作都是原子性的&#xff0c;要…

codeforces CF438D The Child and Sequence 线段树

$ \Rightarrow $ 戳我进CF原题 D. The Child and Sequencetime limit per test: 4 secondsmemory limit per test: 256 megabytesinput: standard inputoutput: standard outputAt the childrens day, the child came to Pickss house, and messed his house up. Picks was ang…

大型网站架构演变

今天我们来谈谈一个网站一般是如何一步步来构建起系统架构的&#xff0c;虽然我们希望网站一开始就能有一个很好的架构&#xff0c;但马克思告诉我们事物是在发展中不断前进的&#xff0c;网站架构也是随着业务的扩大、用户的需求不断完善的&#xff0c;下面是一个网站架构逐步…

linux的磁盘磁头瓷片作用,Linux 磁盘管理

硬盘物理结构以下三张图片都是磁盘的实物图&#xff0c;一个磁盘是由多块堆放的瓷片组成的&#xff0c;所以磁头的结构也是堆叠的&#xff0c;他要对每一块瓷片进行读取&#xff0c;磁头是可以在不同磁道(在瓷片的表现为不同直径的同心圆&#xff0c;磁道间是有间隔的)之间移动…

多层插件开发框架

先来几张效果图&#xff1a; 1.基于DATASNAP构建的中间件&#xff0c;中间件已经经过实际项目的检验&#xff0c;单台中间件可支持几千客户端&#xff0c;中间件可集群 2.中间件支持同时连接ACCESS\SQL SERVER\MYSQL\ORACLE。。。多种数据库系统 3.中间件同时支持TCP/IP,HTTP&a…

unity3d 可视化编程_R编程系列:R中的3D可视化

unity3d 可视化编程In the last blog, we have learned how to create “Dynamic Maps Using ggplot2“. In this article, we will explore more into the 3D visualization in R programming language by using the plot3d package.在上一个博客中&#xff0c;我们学习了如何…

linux无法设置变量,linux – crontab在作业之前无法设置变量

我的crontab看起来像&#xff1a;rootslack13x64:~# crontab -l -u dnd# some variablesSHELL/bin/bashPATH/bin:/usr/bin:/usr/local/bin:/home/dnd/binMAILTOroot# Actual jobs40 20 * * * /home/dnd/cron_jobs/some_job.sh55 23 * * Fri /home/dnd/cron_jobs/other_job.py作…

详谈P(查准率),R(查全率),F1值

怎么来的&#xff1f; 我们平时用的精度accuracy&#xff0c;也就是整体的正确率 acc predict_right_num / predict_num 这个虽然常用&#xff0c;但不能满足所有任务的需求。比如&#xff0c;因为香蕉太多了&#xff0c;也不能拨开人工的一个一个的看它的好坏(我爱吃啊&#…