NOIp2018普及组T3暨洛谷P5017 摆渡车:题解
题目链接:https://www.luogu.org/problemnew/show/P5017
emm,这次的真的不简单的,T3比T4难?
醉了。。。
蒟蒻肯定没有其他大佬讲的好啊,但肯定尽力,真的敲得呕心沥血,求过 。纪念写出的一道比较经典的线性动规。
分析题意,我(以弱者的角度先看问题) 首先想到的是:排序+贪心。本以为今天如此简单,结果发现是自己太天真了。。。然而之后发现:并不一定要一次接着一次的发车,所以贪心破产。
之后就有点摸不着头脑,去打了T4,出于宣泄直接上爆搜,惊奇的发现样例过了,赶快开心的回来再看T3.
这时候就想:普及深搜,模拟,签到都出了,这道题多半就是动规了吧,于是,扯了这么一大堆下面进入正题。
分析:
思路:动规+前缀和(但据某些大佬说还可以用斜率优化?在这里很抱歉我太弱而不会)。
首先我们直切核心——状态转移方程。
我们可以设f[i]f[i]f[i]表示i时间前所有人的最小等待时间。
PS:在这里如果不好确定方程的维数怎么办?可以结合数据范围和空间限制来考虑(多半是,虽然这题好像也可以有二维与t无关的数组)。
我们可以把每个人的时间都标在一条时间轴上。然后能更直观的理解。
这里借用@sooke 大佬的一张图。
我们假设发车时间为每个来回4min,各位等车的同学如图中蓝点所示。
然后我们假设当前要求的f[i]f[i]f[i]中的i=11i=11i=11,于是下面开始分析。
我们可以发现:如果之前的都已经算出的话,那么状态转移方程可如下所示:
f[i]=min(f[i],f[j]+(cnt[i]−cnt[j])∗i−(sum[i]−sum[j]));f[i]=min(f[i],f[j]+(cnt[i]-cnt[j])*i-(sum[i]-sum[j]));f[i]=min(f[i],f[j]+(cnt[i]−cnt[j])∗i−(sum[i]−sum[j]));
其中cnt[i]cnt[i]cnt[i]代表第i时间到达车站的同学的人数,sum[i]sum[i]sum[i]代表第i时间到达车站的同学的时间的总和。
jjj即为上一辆车的发车时间。
刚开始我们对于j的范围,应该能想到是:
0<=j<=i−m0<=j<=i-m0<=j<=i−m
很明显的( ⊙ o ⊙ )!j的取值只要小于i并且和i相聚一个往返时间不就行了吗?
然后的结果是:50分。(官方数据亲测)
但是noip都结束了呀同志,我们不能只局限于50分呀!
所以进行改进:
这时候我们又想:可不可以将j的范围进一步缩小呢?
但其实是肯定可以的。我们发现j可以:
i−2m+1<=j<=i−mi-2m+1<=j<=i-mi−2m+1<=j<=i−m
为什么呢?因为如果两车间的相距时间大于了一趟往返的时间,那么我们完全可以在两者中间继续分割,并不影响原来的答案。
这个时候也是大大的提升了程序的速度,然而:70分(官方数据亲测)
泪奔~
and then ,我们可以继续考虑有没有什么可以剪去的无用状态。
仔细研究发现:当两次发车之间如果没有需要等待的同学的话,直接跳过即可。
经过改正:100分(官方亲测)
AC代码:
#include<cstdio>
#include<cmath>
using namespace std;
int a[501],cnt[4000005],sum[4000005],f[4000005];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
int Time=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
cnt[a[i]]++;
sum[a[i]]+=a[i];
Time=fmax(Time,a[i]);
}
for(int i=1;i<Time+m;i++)
{
cnt[i]+=cnt[i-1];
sum[i]+=sum[i-1];
}
for(int i=0;i<Time+m;i++)
{
if (i>=m&&cnt[i-m]==cnt[i])
{
f[i]=f[i-m];
continue;
}
f[i]=cnt[i]*i-sum[i];
int tmp;
tmp=fmax(i-2*m+1,0);
for(int j=tmp;j<=i-m;j++)
{
f[i]=fmin(f[i],f[j]+(cnt[i]-cnt[j])*i-(sum[i]-sum[j]));
}
}
int ans=2147483647;
for(int i=Time;i<Time+m;i++)
{
ans=fmin(ans,f[i]);
}
printf("%d",ans);
return 0;
}
完结撒花~
NOIp2018普及组T3暨洛谷P5017 摆渡车:题解的更多相关文章
- NOIp2018 TG day1 T2暨洛谷P5020 货币系统:题解
题目链接:https://www.luogu.org/problemnew/show/P5020 这道题感觉比较水啊,身为普及组蒟蒻都不费力的做出来了,而且数据范围应该还能大一些,n起码几万几十万都不 ...
- 洛谷 P5017 摆渡车
题目传送门 解题思路: 个人感觉DP这东西,只可意会,不可言传 AC代码: #include<iostream> #include<cstdio> #include<cs ...
- NOIP2018&2013提高组T1暨洛谷P5019 铺设道路
题目链接:https://www.luogu.org/problemnew/show/P5019 花絮:普及蒟蒻终于A了一道提高的题目?emm,写一篇题解纪念一下吧.求过! 分析: 这道题我们可以采用 ...
- Luogu 5017 NOIP2018普及组T3 摆渡车 (斜率优化 + 必要的转移进行剪枝)
题意: 有 n 名同学要乘坐摆渡车从人大附中前往人民大学,第 i 位同学在第 ti 分钟去 等车.只有一辆摆渡车在工作,但摆渡车容量可以视为无限大.摆渡车从人大附中出发. 把车上的同学送到人民大学. ...
- 洛谷P5017摆渡车
题目 一道做法多种多样的题,DP做法的状态也很多. 我用\(dp[i]\)表示在第i秒发车的时间和,然后dp方程就很好写了 \(dp[i] = dp[j] + i车的等待时间\)j属于i-2m ~ i ...
- P5017 [NOIP2018 普及组] 摆渡车
P5017 [NOIP2018 普及组] 摆渡车 题目 P5017 思路 将实际问题抽象后,不难发现这是一个 区间 \(DP\) 我们不妨认为时间是一条数轴,每名同学按照到达时刻分别对应数轴上可能重合 ...
- NOIP2018普及组复赛游记
2018年11月10日,NOIP2018普及组复赛. 这是我初中阶段最后一次复赛了. 和往常一样,我们在预定的早上7点,没有出发. 10分钟之后,人终于到齐了,于是出发了,一路无话. 到了南航,合照三 ...
- NOIP2018普及组初赛解题报告
本蒟蒻参加了今年的NOIP2018普及组的初赛 感觉要凉 总而言之,今年的题要说完全没有难度倒也不至于,还有不少拼RP的题,比如第一次问题求解考逻辑推理,第一次完善程序考双链表等 下面我就和大家一起看 ...
- [NOIP2013 提高组] 华容道 P1979 洛谷
[NOIP2013 提高组] 华容道 P1979 洛谷 强烈推荐,更好的阅读体验 经典题目:spfa+bfs+转化 题目大意: 给出一个01网格图,和点坐标x,y空格坐标a,b,目标位置tx,ty要求 ...
随机推荐
- PING[ARC2]: Heartbeat failed to connect to standby 'gqtzdb_dg'. Error is 16047
Data Guard搭建完毕之后,执行开启归档路径2,结果发现不同步, SQL> alter system set log_archive_dest_state_2=enable; 查看错误日志 ...
- Firemonkey实现Mac OS程序中内嵌浏览器的功能(自己动手翻译,调用苹果提供的webkit框架)
XE系列虽然可以跨平台,但是在跨平台的道路上只是走了一小半的路,很多平台下的接口都没实现彻底,所以为了某些功能,还必须自己去摸索. 想实现程序中可以内嵌浏览器的功能,但是Firemonkey还没有对应 ...
- SAP TABLECONTROL 自定义SEARCH HELP
项目上需要开发一个界面如下的应用程序.这是一个MB1A发料的辅助程序,限制住移动类型和在特定字段写入产品号. 这个应用程序的主要功能毫无疑问是通过BAPI实现的.但在TABLECONTROL中需要对填 ...
- 网络基础与FTP准备
一网络基础 1.端口: 端口是为了将同一台电脑上的不同程序进行隔离 (IP是在找电脑,端口是在找电脑上的程序) 实例: MySQL是一个软件,帮助我们在硬盘上进行操作,默认端口是3306 Redis是 ...
- 30411MySQL安装与配置_win10
1 下载 1.1下载地址 下载地址 https://downloads.mysql.com/archives/community/ 1.2 选择适合自己的版本并下载 1.3 将下载文件解压至自定义路 ...
- Netty源码分析--创建Channel(三)
恩~,没错,其实这一篇才是真正的开始分析源码,你打我呀~. 先看一下我Netty的启动类 private void start() throws Exception { EventLoopGroup ...
- Unity Shader 屏幕后效果——颜色校正
屏幕后效果指的是,当前整个场景图已经渲染完成输出到屏幕后,再对输出的屏幕图像进行的操作. 在Unity中,一般过程通常是: 1.建立用于处理效果的shader和临时材质,给shader脚本传递需要控制 ...
- 最新ubuntu搭建公网个人邮件服务器(基于postfix,dovecot,mysql)
最近做了一个应用,需要用邮件发通知,但是免费的邮箱每天发信数量是有限制的,所以呢就想着搭建一个自己的邮件服务器,能够实现邮件的发送和接收即可,其中大概花了一个星期找资料,测试,终于成功了,写个教程 ...
- spring源码深度解析— IOC 之 自定义标签解析
概述 之前我们已经介绍了spring中默认标签的解析,解析来我们将分析自定义标签的解析,我们先回顾下自定义标签解析所使用的方法,如下图所示: 我们看到自定义标签的解析是通过BeanDefinition ...
- Ceph原理动画演示
动图生动刻画Ceph的基本原理之集群搭建及数据写入流程:)