(本文将笔者测试时的想法及赛后想法均写出来了)
题目:
话说某某在 \(cj\) 校运会上异军突起,其实不是偶然,而是有历史原因的。
时光回溯到 \(XX\) 年前,某某为了心中的理想,每天爬 \(N\) 里山路上学。直到有一天 \(mlj\) (也就是战神 \(Mars\))来到这里,被某某所打动,于是决定帮某某一把。从某某家到学校中间的这 \(N\) 里山路在一条直线上,第 \(i\) 里山路的海拔高度为 \(H_i\) ,如果一段相同高度的山路两边都比它低或者是山的边界,那么这段山路将被称之为“山顶”。$mlj $想这连绵起伏的山路爬着多累啊,于是他决定动用神力,降低某些山路的海拔高度使得山顶的个数不超过 \(K\)。但 \(mlj\) 不想做得太明显而被某某发现,于是他求助于你。
请求出要使“山顶”的数目不超过k,所有山路降低的高度之和至少是多少。
分析过程:
-
[\(1\)] : 因为要求我们保留最后 \(k\) 个山顶后,所删除的高度最小,首先我们考虑贪心,我们先考虑将这个图形分一下层,那么每次一段区间两端出现 \(0\) 时,那么这段区间就有 至少一个 山顶。但是由于笔者认为太复杂就换了一种错误的想法。下面先说一下错误的想法(可略过)。
-
[\(2\)]:我们考虑先找到所有的山顶,然后利用贪心的思想去掉多余的最小的山顶,但是这种做法会忽视掉一个大山顶上包含若干个小山顶的情况,那么我们就要解决这个问题。
-
[\(3\)]:我们可以利用线段树来维护某一段区间的山顶个数,然后从顶往去减掉多余的山顶,减到只剩一个的时候停止。而这种做法太复杂了,我们就又回到了分层的想法。我们考虑将这个图按高度分一下层,然后先求出大的山顶,若大山顶个数大于 \(k\) ,那么我们就可以直接选取最小的去删掉,然后用线段树标记一下这个区间。那这种贪心策略是否正确呢,显然不正确。假如说某一个山顶上恰好有 \(k\) 个山顶,而与他同层的也恰好有 \(k\) 个,那么我们怎样处理呢。我们很容易想到用 \(dp\) 来将所有情况处理出来