题目链接

众所周知,这道题和积木大赛是同一道题

题意就是给出一段自然数序列,每次操作\((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】铺设道路的更多相关文章

  1. 洛谷 P5019 铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...

  2. NOIP2018&2013提高组T1暨洛谷P5019 铺设道路

    题目链接:https://www.luogu.org/problemnew/show/P5019 花絮:普及蒟蒻终于A了一道提高的题目?emm,写一篇题解纪念一下吧.求过! 分析: 这道题我们可以采用 ...

  3. 洛谷 P5019 铺设道路 & [NOIP2018提高组](贪心)

    题目链接 https://www.luogu.org/problem/P5019 解题思路 一道典型的贪心题. 假设从左往右填坑,如果第i个深与第i+1个,那么第i+1个就不需要额外填: 如果第i+1 ...

  4. 洛谷P5019 铺设道路 题解 模拟/贪心基础题

    题目链接:https://www.luogu.org/problemnew/show/P5019 这道题目是一道模拟题,但是它有一点贪心的思想. 我们假设当前最大的深度是 \(d\) ,那么我们需要把 ...

  5. 洛谷 P5019 铺设道路(差分)

    嗯... 题目链接:https://www.luogu.org/problem/P5019 首先简化一下题意: 给定一个长为N的数组,每次操作可以选择一个区间减去1,问最少多少次操作可以将数组中的数全 ...

  6. 题解【洛谷P5019】[NOIP2018]铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 \(n\) 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 \(n\) 块首尾相连的区域,一开始,第 \(i\) 块区域下陷的深度 ...

  7. 洛谷P5019 [NOIP2018 提高组] 铺设道路

    题目描述 春春是一名道路工程师,负责铺设一条长度为 n 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 n 块首尾相连的区域,一开始,第 i 块区域下陷的深度为 di. 春春每天可以 ...

  8. [NOIP2014] 提高组 洛谷P2296 寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  9. NOIP2014 day2 T2 洛谷P2296 寻找道路

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

随机推荐

  1. mongoDB 分组并对分组结果筛选类似于SQL中的(group by xxx having ) 附带Java代码

    今天需要做一个筛选程序,因为数据放在mongodb中,没写过分组的查询语句,查了一些资料,终于写出来了,分享给各位小伙伴 需求是 查询 学员 在2019-07-29之后未同步的数据(同一个学员需要2条 ...

  2. linux 流量监控利器:iftop

    在类Unix系统中可以使用top查看系统资源.进程.内存占用等信息. 查看网络状态可以使用netstat.nmap等工具. 若要查看实时的网络流量,监控TCP/IP连接等,则可以使用iftop. if ...

  3. feign.FeignException: status 400 reading

    feign.FeignException: status 400 reading : 请求方调用报错: 服务方被调用报错: 用fegin给redis设置缓存时报错,刚好 卡到8k这个临界点 ,就一直报 ...

  4. 常用方法装windows

    1.通过制作启动盘来进行安装 (1)简单的启动盘制作工具 通过百度”启动盘“,会发现有很多制作启动盘的工具. 这些工具操作都比较简单,易于上手,功能强大,不仅能装系统,而且还能维修. 具体使用方法,官 ...

  5. MySQL修炼之路五

    1. 存储引擎和锁 1. 存储引擎(处理表的处理器) 1. 基本操作 1. 查看所有存储引擎 mysql>show engines; 2. 查看已有表的存储引擎 mysql>show cr ...

  6. Deployment

    Deployment RC是kubernetes中的一个核心概念,Deployment 是新一代的RC,除了拥有RC的功能外,还具备一下特性: 支持事件和状态查看:可以查看Deployment升级的状 ...

  7. Linux虚拟机安装(rhel 7.4)

    Linux虚拟机安装(rhel 7.4) linux 1. 创建虚拟机 1.1. 新建虚拟机 1.2. 启动虚拟机 附录:部分配置 1. 创建虚拟机 1.1. 新建虚拟机 新建虚拟机 典型虚拟机 稍后 ...

  8. Django项目中使用qq第三方登录。

    使用qq登录的前提是已经在qq互联官网创建网站应用并获取到QQ互联中网站应用的APP ID和APP KEY 1,建路由 # qq登录 path('loginQq/',qq.loginQq,name=' ...

  9. 基于Asp.net core + EF + Sqlite 5分钟快速上手一个小项目

    虽然该方法不会用在实际开发中,但该过程对于初学者还是非常友好的,真应了麻雀虽小,五脏俱全这句话了.好了不多废话了,直接开始!! 1.建立一个名为test的Asp.net core web应用程序 这一 ...

  10. C# List<T>排序总结

    这里有很多种方法对List进行排序,本文总结了三种方法,但有多种实现. 1.对基础类型排序 方法一: 调用sort方法,如果需要降序,进行反转: List<int> list = new ...