Java教程

2022/09/26小测 题解

本文主要是介绍2022/09/26小测 题解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

(本文将笔者测试时的想法及赛后想法均写出来了)

题目:

话说某某在 \(cj\) 校运会上异军突起,其实不是偶然,而是有历史原因的。
时光回溯到 \(XX\) 年前,某某为了心中的理想,每天爬 \(N\) 里山路上学。直到有一天 \(mlj\) (也就是战神 \(Mars\))来到这里,被某某所打动,于是决定帮某某一把。从某某家到学校中间的这 \(N\) 里山路在一条直线上,第 \(i\) 里山路的海拔高度为 \(H_i\) ,如果一段相同高度的山路两边都比它低或者是山的边界,那么这段山路将被称之为“山顶”。$mlj $想这连绵起伏的山路爬着多累啊,于是他决定动用神力,降低某些山路的海拔高度使得山顶的个数不超过 \(K\)。但 \(mlj\) 不想做得太明显而被某某发现,于是他求助于你。
请求出要使“山顶”的数目不超过k,所有山路降低的高度之和至少是多少。
image

分析过程:

  • [\(1\)] : 因为要求我们保留最后 \(k\) 个山顶后,所删除的高度最小,首先我们考虑贪心,我们先考虑将这个图形分一下层,那么每次一段区间两端出现 \(0\) 时,那么这段区间就有 至少一个 山顶。但是由于笔者认为太复杂就换了一种错误的想法。下面先说一下错误的想法(可略过)。

  • [\(2\)]:我们考虑先找到所有的山顶,然后利用贪心的思想去掉多余的最小的山顶,但是这种做法会忽视掉一个大山顶上包含若干个小山顶的情况,那么我们就要解决这个问题。

  • [\(3\)]:我们可以利用线段树来维护某一段区间的山顶个数,然后从顶往去减掉多余的山顶,减到只剩一个的时候停止。而这种做法太复杂了,我们就又回到了分层的想法。我们考虑将这个图按高度分一下层,然后先求出大的山顶,若大山顶个数大于 \(k\) ,那么我们就可以直接选取最小的去删掉,然后用线段树标记一下这个区间。那这种贪心策略是否正确呢,显然不正确。假如说某一个山顶上恰好有 \(k\) 个山顶,而与他同层的也恰好有 \(k\) 个,那么我们怎样处理呢。我们很容易想到用 \(dp\) 来将所有情况处理出来

这篇关于2022/09/26小测 题解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!