vijos1741 观光公交 (贪心)
|
P1741观光公交
请登录后递交
描述风景迷人的小城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位乘客来到出发景点的时刻,出发的景点编号和到达的景点编号。 输出格式共一行,包含一个整数,表示最小的总旅行时间。 限制1s 提示样例说明: 对D2使用2个加速器,从2号景点到3号景点时间变为2分钟。 公交车在第1分钟从1号景点出发,第2分钟到达2号景点,第5分钟从2号景点出发,第7分钟到达3号景点。 第1个旅客旅行时间7 - 0 = 7分钟; 总时间7 + 1 + 2 = 10分钟。 数据范围: 对于10%的数据,k = 0; 来源NOIp2011提高组Day2第三题 |
大意:题目说得很清楚,我都怕。
题解:贪心,一个个选择氮气加速的位置。
首先我们看乘客所花时间和怎么计算,容易得到一个乘客所花的时间等于
ar[b[i]] - T[i]
其中b[i]为该乘客的终点,ar[x]为到达x站的时间,T[i]为该乘客出发的时间。
我们把到达x的乘客统计,cntto[x]为到达x的乘客的数量,然后所有乘客所花的时间和,就是sum(cntto[i]*ar[i])-sumT,cntto和sum都是已知的,关键在于ar。
设st[i]为从i出发的最晚一名游客的出现时间,这样我们可以用st[i]和d[i]来从头到尾得到各个点的ar[i]。
for(i=; i<n; i++) artime[i]=max(artime[i-],st[i-])+d[i-];
然后我们一个个氮气加速分别考虑,每次贪心放在能减少时间总和最多的位置。对每个位置计算,向后推若干个ar[i]>st[i],即有发展潜力的位置,(若ar[i]<=st[i],则减少ar[i]也无法减少之后游客的时间)。
for(i=; i<n-; i++) {
if(d[i]>) {
canup=cntto[i+];
j=i+;
while(j+<n && artime[j]>st[j])canup+=cntto[j+],j++;
//cout<<i<<','<<j<<endl;
if(canup>maxup) {
maxup=canup;
maxi=i;
}
}
}
这样我们就在maxi处氮气加速,效果最碉。
重复多次,用完所有氮气加速,完成。
//#pragma comment(linker, "/STACK:102400000,102400000")
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<stack>
#include<queue>
using namespace std;
#define ll long long
#define usint unsigned int
#define mz(array) memset(array, 0, sizeof(array))
#define minf(array) memset(array, 0x3f, sizeof(array))
#define REP(i,n) for(i=0;i<(n);i++)
#define FOR(i,x,n) for(i=(x);i<=(n);i++)
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define WN(x) printf("%d\n",x);
#define RE freopen("D.in","r",stdin)
#define WE freopen("1biao.out","w",stdout) const int maxn=;
const int maxm=;
int d[maxn],T[maxm],a[maxm],b[maxm];
int st[maxn],artime[maxn];
int cntto[maxn];
int canup[maxn];
int n,m,k;
ll Tsum; int main() {
int i,j;
int maxi,maxup,canup;
ll ans;
while(scanf("%d%d%d",&n,&m,&k)!=EOF) {
REP(i,n-) scanf("%d",&d[i]);
mz(st);
mz(cntto);
Tsum=;
REP(i,m) {
scanf("%d%d%d",&T[i],&a[i],&b[i]);
a[i]--;b[i]--;
if(st[a[i]]<T[i])st[a[i]]=T[i];
cntto[b[i]]++;
Tsum+=T[i];
}
artime[]=;
for(i=; i<n; i++) artime[i]=max(artime[i-],st[i-])+d[i-];
while(k>) {
maxi=-;
maxup=-;
for(i=; i<n-; i++) {
if(d[i]>) {
canup=cntto[i+];
j=i+;
while(j+<n && artime[j]>st[j])canup+=cntto[j+],j++;
//cout<<i<<','<<j<<endl;
if(canup>maxup) {
maxup=canup;
maxi=i;
}
}
}
d[maxi]--;
//printf("WOW,%d!",maxi);
artime[]=;
k--;
for(i=; i<n; i++) artime[i]=max(artime[i-],st[i-])+d[i-];
}
ans=-Tsum;
for(i=; i<n; i++)
ans+=artime[i]*cntto[i];
printf("%lld\n",ans);
}
return ;
}
vijos1741 观光公交 (贪心)的更多相关文章
- [luogu]P1315 观光公交[贪心]
[luogu]P1315 [NOIP2011]观光公交 ——!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...
- 洛谷 P1315 观光公交 —— 贪心
题目:https://www.luogu.org/problemnew/show/P1315 问题是想不明白改动一条边会对后面造成怎样的影响: 实际上影响的会是一段,当某个车站出发时间受其来人牵制时, ...
- $Noip2011/Luogu1315$ 观光公交 贪心
$Luogu$ $Sol$ 觉得这题贪心要想很多事情,不适合我这种没脑子选手$ovo$.看题解还理解了很久. 最开始是这样想的:把所有的路段上的乘客按大小排个序用加速器就好了,这个想法被自己轻松$ha ...
- Luogu 1315 【NOIP2011】观光公交 (贪心)
Luogu 1315 [NOIP2011]观光公交 (贪心) Description 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供 ...
- 观光公交 2011年NOIP全国联赛提高组(贪心,递推)
观光公交 2011年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 风景迷人的小城 Y 市 ...
- luoguP1315 观光公交 题解(NOIP2011)(贪心)
P1315 观光公交 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cm ...
- NOIP2011 观光公交
3.观光公交 (bus.cpp/c/pas) 风景迷人的小城 Y 市,拥有 n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特 意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 ...
- noip 2011观光公交
P1315 观光公交 95通过 244提交 题目提供者该用户不存在 标签贪心递推2011NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录 题目描述 风景迷人的小城Y 市,拥有n 个美 ...
- NOIP观光公交
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #inc ...
随机推荐
- 【BZOJ-3667】Rabin_Miller算法 随机化判素数
3667: Rabin-Miller算法 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 983 Solved: 302[Submit][Status ...
- linux永久更改eth0的ip地址后仍然ping不通过
编辑文件/etc/sysconfig/network-scripts/ifcfg-eth0 引用:DEVICE=eth0 //设备名称,不要修改 BOOTPROTO=static //不要修改 BRO ...
- ECMall /app/buyer_groupbuy.app.php SQL Injection Vul
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Relevant Link: 2. 漏洞触发条件 0x1: POC ht ...
- 帮助理解委托、匿名委托、Lambda表达式还有事件
写了一个小程序,能够很好的认识到这三个的用法 namespace Lambda { /// <summary> /// 实现根据指定运算形式 输出结果 /// </summary&g ...
- MVC5-6 帮助类
视图帮助类 HtmlHelper HtmlHelper给我们封装了大量的常用方法,使我们的开发更具高效.那么其中有哪里是我们常用的呢? BingForm 生成form表单 上图简单的使用了Html.B ...
- 有return的情况下try catch finally的执行顺序
结论:1.不管有木有出现异常,finally块中代码都会执行:2.当try和catch中有return时,finally仍然会执行:3.finally是在return后面的表达式运算后执行的(此时并没 ...
- 泛在传感器网络(Ubiquitous Sensor Network; USN)
http://wiki.mbalib.com/wiki/%E6%B3%9B%E5%9C%A8%E4%BC%A0%E6%84%9F%E5%99%A8%E7%BD%91%E7%BB%9C 什么是泛在传感器 ...
- 如何保存联系人到系统通讯录(android)
1 效果演示: 2 代码演示:
- logback 详解
原创文章,转载请指明出处:http://aub.iteye.com/blog/1103685, 尊重他人即尊重自己 详细整理了logback常用配置, 不是官网手册的翻译版,而是使用总结,旨在更快更透 ...
- js006-面向对象的程序设计
js006-面向对象的程序设计 面向对象(Object-Oriented,OO)的语言有一个标志,那就是他们都有类的概念.而通过类可以创建多个具有相同属性和方法的对象. ECMA-262把对象定义为: ...