[NOIP2011]观光公交 题解
题目大意:
就省了吧
思路:
应该算是贪心。
不难发现,加速只对所有在使用加速器之后连续的一段下车时不用等人的站点下车的人有用。这非常重要。
先算出不加速时的和,并预处理出每个站点最迟到的人的时间、每个站下车的人数。然后一个一个放加速器,加速器放在惠及最多的人的一段,同时维护到每个站点的时间(判断用不用等人)。
于是就有了一种比较暴力的算法:每次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]观光公交 题解的更多相关文章
- luoguP1315 观光公交 题解(NOIP2011)(贪心)
P1315 观光公交 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cm ...
- NOIP2011 观光公交
3.观光公交 (bus.cpp/c/pas) 风景迷人的小城 Y 市,拥有 n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特 意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 ...
- 题解【洛谷P1315】[NOIP2011]观光公交
题目描述 风景迷人的小城 Y 市,拥有 \(n\) 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务. 观光公交车在第 \(0\) 分钟出现在 \( ...
- [NOIP2011] 观光公交(贪心)
题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...
- 贪心(模拟费用流):NOIP2011 观光公交
[问题描述] 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2. ...
- [搬运] [贪心]NOIP2011 观光公交
推荐这篇题解:http://www.cnblogs.com/Blacko/archive/2013/10/18/3376597.html 只不过这篇题解有一些细节没有说清,但建议自己思考- Codes ...
- NOIP2011 观光公交 加强版
传送门 题目大意 给定从左到右的$n$个车站以及两两之间通行的需要的时间. 有$m$个人,第$i$个人会在$T_i$时刻出现在$a_i$车站,目的地是$b_i$. 一辆车第$0$时刻出现在一号站台,从 ...
- [luogu]P1315 观光公交[贪心]
[luogu]P1315 [NOIP2011]观光公交 ——!x^n+y^n=z^n 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车, ...
- 洛谷P1315 [NOIP2011提高组Day2T3] 观光公交
P1315 观光公交 题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号 ...
随机推荐
- Startup配置类 居然又是约定
Microsoft.Owin.Host.SystemWeb 这个dll可以让OWin接管IIS的请求,虽然同样是托管在IIS,但是所有的请求都会被OWin来处理.在OWin的4层结构中(Applica ...
- 初识Docker和Windows Server容器
概览 伴随着Windows Server 2016 Technical Preview 3 (TP3)版本的发布,微软首次提供了Windows平台下地原生容器.它集成了Docker对Windows S ...
- [NHibernate]O/R Mapping基础
系列文章 [Nhibernate]体系结构 [NHibernate]ISessionFactory配置 [NHibernate]持久化类(Persistent Classes) 引言 对象和关系数据库 ...
- Activity初接触
Activity中TextView的文字显示Hello Android: 1.直接显示:<TextView android:text="Hello Android" /> ...
- IAP
release_check_url := "https://buy.itunes.apple.com/verifyReceipt" debug_check_url := " ...
- Mongodb启动命令mongod参数说明
Mongodb启动命令mongod参数说明 mongod的主要参数有: 基本配置 ----------------------------------------------------------- ...
- 编译安装 Zend Opcache 缓存Opcache,加速 PHP
Optimizer+ 是 Zend 开发的闭源但可以免费使用的 PHP 优化加速组件,是第一个也是最快的 opcode 缓存工具.现在,Zend 科技公司将 Optimizer+ 在 PHP Lice ...
- C和指针 第四章 习题
4.1正数的n的平方根可以通过: ai+1= (ai + n / ai ) / 2 得到,第一个a1是1,结果会越来越精确. #include <stdio.h> int main() { ...
- python之路六
面向对象 引言 提到面向对象,总是离不开几个重要的术语:多态(Polymorphism),继承(Inheritance)和封装(Encapsulation).Python也是一种支持OOP的动态语言, ...
- Android Killer工具用法
一.工程信息 工程信息主要是解析的AndroidManifest文件 二.工程管理器 三.配置插入代码 在代码中点右键就可以一键插入代码了 四.字符串搜索功能 支持正则, 比jeb搜索功能强大 来自为 ...