NOIP2011观光公交
2015-07-07 09:57
337 查看
var
ans,n,m,k,i:longint;
arrive,d,t,a,b,down,latest:array[0..10001] of longint;
function mmax(a,b:longint):longint;
begin
if a>b then exit(a)
else exit(b);
end;
procedure doit;
var
i,j,max,tip,pos:longint;
begin
for i:=2 to n do
arrive[i]:=mmax(arrive[i-1],latest[i-1])+d[i-1]; //求出每一站的到站时间,每用一次加速器,d[i]都会变化,arrive[i]也会变化,所以每次都要更新
// max(arrive[i-1],lastest[i-1])意思是找到应该发车的时间
pos:=0; //pos表示即将找到的要用加速器的站点位置
max:=0; //max加速器能作用人数的最大值
for i:=1 to n-1 do //枚举各个站点来找pos
if d[i]>0 then //保证行车时间>0
begin
tip:=0; //tip表示求每次加速器能作用的人数
for j:=i+1 to n do //从每个站的后面开始找tip
begin
tip:=tip+down[j];
if arrive[j]<=latest[j] then break; //如果不会影响后面了就停止 条件是车到站之后还要等乘客或者乘客刚好到,
//因为使用加速器之后到达时间会变早,所以就算这次乘客刚到,
//在前面用了加速器之后也不会影响这一站之后的
end;
if tip>max then
begin
max:=tip; //max加速器能作用人数的最大值,在这一步求出
pos:=i; //记下最大作用站点的位置
end;
end;
dec(d[pos]); //在pos这个站点使用加速器
dec(k); //用了一个加速器,k-1
end;
begin
readln(n,m,k);
for i:=1 to n-1 do read(d[i]); //d[i]表示路程上消耗的时间
for i:=1 to m do
begin
readln(t[i],a[i],b[i]);
if latest[a[i]]<t[i] then latest[a[i]]:=t[i]; //latest[i]表示最后一个人到第i站的时间
inc(down[b[i]]); //down[i]表示第i站下车人数 统计每站下车人数
end;
arrive[1]:=latest[1]; //arrive[i]表示最早到站时间 这一步暂不明白有何用,看起来可以去掉
while k>0 do doit;
for i:=2 to n do
arrive[i]:=mmax(arrive[i-1],latest[i-1])+d[i-1];//更新一下最后用的那个加速器
ans:=0; //加速器用完了,现在开始求答案
for i:=1 to m do //一共m个人
ans:=ans+arrive[b[i]]-t[i]; //t[i]表示上车时间,b[i]是下车站点,arrive[b[i]]就是下车时间
writeln(ans);
end.
相关文章推荐
- windows下webrtc的编译 2015
- SqlDataAdapter.Update批量数据更新
- char*,const char*和string的相互转换
- activiti-tomcat
- iOS开发之多表视图滑动切换示例(仿"头条"客户端)---优化篇
- FreeMarker如何输出特殊含义字符
- 记录SQL Server2008日志文件损坏的恢复过程
- python 进程池Pool
- Extension Method[上篇]
- 使用Hyper-V集群和存储功能以达到HA
- 一次完整的HTTP事务过程分析
- Myeclipse SVN插件使用
- 双机 集群 容灾 负载均衡的理解
- [Leetcode]Number of Island
- windows平台下载webrtc代码和生成vs2013工程(非ninja)
- 感谢陪一起走过心路历程的人
- 版本控制-搭建git服务器
- Happy Number
- 提高 Vim 和 Shell 效率的 9 个建议
- cocos2dx解压缩文件