CF1793E 题解

动态规划题。首先我们对 $a$ 数组排个序,因为 $a_i$ 小的不管什么情况下都比 $a_i$ 大的更优。

有结论:设最终答案为 $t$ 人满足,那么前缀 $1$ 到 $t$ 的人必定能构成一种可行方案。

还有结论:假设一种方案分出了 $x$ 个组,那么一定能合并成 $1$ 到 $x-1$ 中任意数量的组。也就是说,我们只要求出满足多少人的情况下最多能分成多少组别,小于这个组别数量的也都是可行的。

不难发现状态 $f_i$ 表示要求前 $i$ 个人满意的最多组别,有递推式 $f_i=mx_{i-a_i}+1$ 其中 $mx$ 数组是 $f$ 数组的前缀最大值,由于一组一定是连续的一段区间,所以能这样转移。至于 $a_i>i$ 的情况 $f_i=0$ 表示不可行。

注意,我们现在的 $f_i$ 还没有算上后面不满足的人的组别数。在推出所有的 $f_i$ 之后,如果 $i \le a_i$ 那么加上 $n-i$ 表示剩下的既然不满足那就可以每人成一个组别,如果 $i > a_i$ 那么为 $n-a_i+1$ 其中 $n-a_i$ 表示 $a_i$ 这个位置之后的每个都自成一组,前 $a_i$ 个成一组,虽然 $a_i$ 那个人可能不满足,但对于 $i$ 及其以前位置满足就够了。

最后把 $f_i$ 映射到一个数组其下标表示组别数,再做一个后缀最大值即可。

代码

posted @ 2023-02-14 21:18  徐子洋  阅读(13)  评论(0)    收藏  举报  来源