题目大意:

  就省了吧

思路:

  应该算是贪心。

  不难发现,加速只对所有在使用加速器之后连续的一段下车时不用等人的站点下车的人有用。这非常重要。

  先算出不加速时的和,并预处理出每个站点最迟到的人的时间、每个站下车的人数。然后一个一个放加速器,加速器放在惠及最多的人的一段,同时维护到每个站点的时间(判断用不用等人)。

  于是就有了一种比较暴力的算法:每次n2暴力求解每次加速后停下来的站点,再修改答案、维护数组。

  但是这似乎会TLE(虽然官方数据貌似AC了),于是就有了优化。你可以逆推求解停下来的站点,再用前缀和O(n)求解人数。

代码:

  暴力:

 #include<cstdio>
#include<iostream>
using namespace std;
const int M=,N=;
int n,m,k,i,j,mx,ans,t[M],off[M],last[M],come[M],down[M],dist[N]; int read()
{
int x=;
char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
} int main()
{
n=read(),m=read(),k=read();
for (i=;i<n;i++) dist[i]=read();
for (i=;i<=m;i++) t[i]=read(),last[j=read()]=max(last[j],t[i]),off[down[i]=read()]++;
for (i=;i<n;i++) come[i+]=max(come[i],last[i])+dist[i];
for (i=;i<=m;i++) ans+=come[down[i]]-t[i];
while (k--)
{
for (i=;i<=n;i++) t[i]=;
for (i=;i<n;i++)
if (dist[i])
for (j=i+;j<=n;j++)
{
t[i]+=off[j];
if (come[j]<=last[j]) break;
}
mx=;
for (i=;i<n;i++)
if (t[i]>mx) mx=t[i],j=i;
dist[j]--,ans-=t[j],come[++j]--;
for (;j<n;j++) come[j+]=max(come[j],last[j])+dist[j];
}
printf("%d\n",ans);
return ;
}

  优化:

 #include<cstdio>
#include<iostream>
using namespace std;
const int M=,N=;
int n,m,i,j,k,mx,ans,t[M],far[N],sum[N],off[M],last[M],come[M],dist[N]; int read()
{
int x=; char ch=getchar();
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='') x=(x<<)+(x<<)+ch-,ch=getchar();
return x;
} int main()
{
n=read(),m=read(),k=read();
for (i=;i<n;i++) dist[i]=read();
for (i=;i<=m;i++) t[i]=read(),last[j=read()]=max(last[j],t[i]),sum[off[i]=read()]++;
for (i=;i<n;i++) come[i+]=max(come[i],last[i])+dist[i];
for (i=;i<=m;i++) ans=ans+come[off[i]]-t[i];
for (i=;i<=n;i++) sum[i]=sum[i]+sum[i-];
while (k--)
{
far[n-]=n,mx=;
for (i=n-;i;i--)
if (come[i+]>last[i+]) far[i]=far[i+]; else far[i]=i+;
for (i=;i<n;i++)
if (sum[far[i]]-sum[i]>mx && dist[i]) mx=sum[far[i]]-sum[i],j=i;
if (!mx) break; --dist[j],ans=ans-mx;
for (come[]=,i=;i<n;i++) come[i+]=max(come[i],last[i])+dist[i];
}
printf("%d\n",ans);
return ;
}

[NOIP2011]观光公交 题解的更多相关文章

  1. luoguP1315 观光公交 题解(NOIP2011)(贪心)

    P1315 观光公交 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cm ...

  2. NOIP2011 观光公交

    3.观光公交 (bus.cpp/c/pas) 风景迷人的小城 Y 市,拥有 n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特 意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 ...

  3. 题解【洛谷P1315】[NOIP2011]观光公交

    题目描述 风景迷人的小城 Y 市,拥有 \(n\) 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务. 观光公交车在第 \(0\) 分钟出现在 \( ...

  4. [NOIP2011] 观光公交(贪心)

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  5. 贪心(模拟费用流):NOIP2011 观光公交

    [问题描述] 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2. ...

  6. [搬运] [贪心]NOIP2011 观光公交

    推荐这篇题解:http://www.cnblogs.com/Blacko/archive/2013/10/18/3376597.html 只不过这篇题解有一些细节没有说清,但建议自己思考- Codes ...

  7. NOIP2011 观光公交 加强版

    传送门 题目大意 给定从左到右的$n$个车站以及两两之间通行的需要的时间. 有$m$个人,第$i$个人会在$T_i$时刻出现在$a_i$车站,目的地是$b_i$. 一辆车第$0$时刻出现在一号站台,从 ...

  8. [luogu]P1315 观光公交[贪心]

    [luogu]P1315 [NOIP2011]观光公交 ——!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...

  9. 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交

    P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...

随机推荐

  1. wordpress 函数、条件判断以及文件的总结

    WordPress基本模板文件 一套完整的WordPress模板应至少具有如下文件: style.css : CSS(样式表)文件 index.php : 主页模板 archive.php : Arc ...

  2. tyvj1096 数字组合

    描述 在N个数中找出其和为M的若干个数.先读入正整数N(1<N<100)和M(1<M<10000), 再读入N个正数(可以有相同的数字,每个数字均在1000以内), 在这N个数 ...

  3. 什么是UIScrollView

    移动设备的屏幕大小是极其有限的,因此直接展示在用户眼前的内容也相当有限 当展示的内容较多,超出一个屏幕时,用户可通过滚动手势来查看屏幕以外的内容 普通的UIView不具备滚动功能,不适合显示过多的内容 ...

  4. 如何应对ISP乱插广告(案例分析)

    一.广告从何而来? 利益让人铤而走险,从而推动行业“发展”:广告的利益还真不小,xx房产门户网站上一个广告位少则几千,多则几十万:记得在校读书的时候,刚学会做网站,第一想法就是等自己的网站发展成熟有人 ...

  5. jQuery入门(1)jQuery中万能的选择器

    jQuery入门(1)jQuery中万能的选择器 jQuery入门(2)使用jQuery操作元素的属性与样式 jQuery入门(3)事件与事件对象 jQuery入门(4)jQuery中的Ajax()应 ...

  6. Shell入门教程:Shell的基本结构

    shell程序的基本组成结构 shell结构大体是由设定变量.内置命令.shell的语法结构.函数组成. 使用实例说明:test.sh #!/bin/bash #说明使用/bin/bash作为这个脚本 ...

  7. Swift3.0P1 语法指南——属性

    原档:https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programmi ...

  8. 笨办法学Python (exercise1-15)

    #exercise1print "Hello world!"print "Hello Again"print "I like typing this. ...

  9. 深入浅出iOS事件机制

    原文地址: http://zhoon.github.io/ios/2015/04/12/ios-event.html 本文章将讲解有关iOS事件的传递机制,如有错误或者不同的见解,欢迎留言指出. iO ...

  10. java基本算法之快速排序

    快速排序:是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确 ...