【洛谷P5019】铺设道路
题目链接
众所周知,这道题和积木大赛是同一道题
题意就是给出一段自然数序列,每次操作\((L,R)\)把区间\([L,R]\)的数全部减一,不允许出现负数,问把序列变为零的最小操作次数
贪心做法
样例
6
4 3 2 5 3 5
大概长这个样子

我们考虑第一列的四块格子,最少需要\(4\)次操作给消除掉

在考虑第二列的\(3\)个格子时,发现都可以在第一列的\(4\)次操作中一起消除掉
第三列的格子也都可以一起消除掉

考虑第四列,我们可以发现,第四列下面的两个格子在前面的操作中可以一起消除,但是上面的三个是至少再进行三次操作才能消除的

而第五列下面的两个格子在第一列的操作中可以消除,上面的一个格子可以在第四列的操作中删除

考虑第六列,上面的\(2\)个格子是前面操作消除不了的,需要\(2\)次操作

那么答案就是\(4+3+2=9\)

这样大概可以总结出做法:当\(a_{i-1}<a_i\)时,\(ans+= a_i - a_{i-1}\)
贪心证明
下面用差分序列给出这个贪心的证明:
我们对原序列\(\{a_i\}\)维护一个差分数组\(\{diff_i\}\)
原序列不妨在最后加一个\(0\),
6
4 3 2 5 3 5 0
差分数组是
4 -1 -1 3 -2 2 -5
每次操作可以表示为\(diff[L]--\),\(diff[R+1]++\)
最终的状态就是差分数组全部变成\(0\)
首先,每次操作最多让一个大于零的\(diff_i\) \(-1\),所以 最优解\(ans>=sum(diff_i,diff_i>0)\)
下面要证明 \(ans=sum(diff_i,diff_i>0)\)
\(a_{n+1}=0\) => \(sum(diff_i)=0\) => \(sum(diff_i,diff_i>0)+sum(diff_i,diff_i<0)=0\)
我们只要每次操作能让一个大于\(0\)的\(diff_i\) \(-1\),同时后面一个小于\(0\)的\(diff_i\) \(+1\)才能够使\(ans=sum(diff_i,diff_i>0)\)
然而有一个限制条件:\(a_L\)~\(a_R\)之间没有零 否则这个操作就是不合法的
我们可以利用以下性质构造解法:
性质1:由题意知任意时刻\(a_i>=0\),若\(diff_i>0\) 则\(a_i>a_{i-1}>=0\),得\(a_i>0\)
性质2:由于\(a_{n+1}=sum(diff_i)=0\),对于一个大于零的\(diff_i\),\(sum(diff_{1}\)~\(diff_{i})=a_i>0\),它的后面一定存在小于零的\(diff_i\)
于是有:每次选一个大于零的\(diff_i\)作为操作的左端点\(L\),它右边的第一个小于零的\(diff_j\)作为\(R+1\),已知\(a_L>0\),\([L,R]\)中任意\(diff_k>=0\),可得任意\(a_k\)属于\([L,R]\),\(a_k>=a_{k-1}>=a_L>0\),因此该操作合法
所以存在至少一种操作方法可以在\(sum(diff_i,diff_i>0)\)次操作后使得\(diff\)序列全部为\(0\),\(ans=sum(diff_i,diff_i>0)\)
【洛谷P5019】铺设道路的更多相关文章
- 洛谷 P5019 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- NOIP2018&2013提高组T1暨洛谷P5019 铺设道路
题目链接:https://www.luogu.org/problemnew/show/P5019 花絮:普及蒟蒻终于A了一道提高的题目?emm,写一篇题解纪念一下吧.求过! 分析: 这道题我们可以采用 ...
- 洛谷 P5019 铺设道路 & [NOIP2018提高组](贪心)
题目链接 https://www.luogu.org/problem/P5019 解题思路 一道典型的贪心题. 假设从左往右填坑,如果第i个深与第i+1个,那么第i+1个就不需要额外填: 如果第i+1 ...
- 洛谷P5019 铺设道路 题解 模拟/贪心基础题
题目链接:https://www.luogu.org/problemnew/show/P5019 这道题目是一道模拟题,但是它有一点贪心的思想. 我们假设当前最大的深度是 \(d\) ,那么我们需要把 ...
- 洛谷 P5019 铺设道路(差分)
嗯... 题目链接:https://www.luogu.org/problem/P5019 首先简化一下题意: 给定一个长为N的数组,每次操作可以选择一个区间减去1,问最少多少次操作可以将数组中的数全 ...
- 题解【洛谷P5019】[NOIP2018]铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...
- 洛谷P5019 [NOIP2018 提高组] 铺设道路
题目描述 春春是一名道路工程师,负责铺设一条长度为 n 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 n 块首尾相连的区域,一开始,第 i 块区域下陷的深度为 di. 春春每天可以 ...
- [NOIP2014] 提高组 洛谷P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
- NOIP2014 day2 T2 洛谷P2296 寻找道路
题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...
随机推荐
- C#泛型集合之——列表
列表基础 1.列表概述:列表与哈希集合不同之处在于,它的元素可以重复.(更接近逻辑上的数组,而哈希集合更接近于数学上的集合) 2.创建及初始化: (1)List<类型> 列表名 =new ...
- C# DataTable、DataSet、List、相互转换
DataTable转LIst /// <summary> /// 利用反射将DataTable转换为List<T>对象 /// </summary> /// & ...
- 4.matplotlib绘制直方图
  # coding=utf-8 from matplotlib import pyplot as plt from matplotlib import font_manager a=[131, ...
- springCloud学习笔记2(服务发现)
本篇代码存放于:https://github.com/FleyX/demo-project/tree/master/springcloud/spring-cloud%E6%9C%8D%E5%8A%A1 ...
- 【MFC】在CHtmlView中在同一窗口显示新打开页面
使用MFC的单文档,用IE核心做的简单浏览器.当打开一个新的链接时,IE核心会使用IE来打开一个新窗口显示打开的新页面.为了让新页面在本程序中显示,我试了如下方法,其中的问题一并列出: 方法1.重载C ...
- CentOS 下运行.net Core程序
系统: 阿里云的默认 CentOS 7.5 镜像 项目环境:.Net Core 2.2 一.安装.Net Core的运行环境 第一步,如果是一台新的服务器,可以升级一下系统的基础软件.如果没有必要也可 ...
- procfs、debugfs
procfs 是进程文件系统(file system) 的缩写,包含一个伪文件系统,用于通过内核访问进程信息 这个文件系统通常被挂载到 /proc 目录.由于 /proc 不是一个真正的文件系统,它也 ...
- mysql修改表结构,添加double类型新列
ALTER TABLE t_cas_construction_statistics ADD COLUMN resource_one_online_count DOUBLE(128,0) COMMENT ...
- Pandas 数据筛选,去重结合group by
Pandas 数据筛选,去重结合group by 需求 今小伙伴有一个Excel表, 是部门里的小伙9月份打卡记录, 关键字段如下: 姓名, 工号, 日期, 打卡方式, 时间, 详细位置, IP地址. ...
- githe和github连接,上传
Git入门 如果你完全没有接触过Git,你现在只需要理解通过Git的语法(敲入一些命令)就可以将代码上传到远程的仓库或者下载到本地的仓库(服务器),可知我们此时应该有两个仓库,就是两个放代码的地方,一 ...