CF1077
CF1077E
题意
Polycarp 有 \(n\) 个问题,问题的主题分别是 \(a_1, a_2, \dots, a_n\),Polycarp 需要组织一些专题比赛,同时要满足以下条件:
-
一场专题比赛中的所有题目的主题相同
-
组织的所有专题比赛中主题互异
-
从第二场比赛开始,比赛中的题目数必须是前一场比赛题目数量的 \(2\) 倍,第一场比赛的题目数量可以是任意的
-
所有比赛使用的题目数量之和最大
求所有比赛使用的题目数量之和的最大值。
注意:不需要使比赛的数量最大,不一定需要使用所有的题目,不一定需要使用所有的主题。
思路
我们考虑用一个桶来记录所有专题的题目数量。
因为专题的值高达 \(10 ^ 9\),需要离散化一下。
所以就有一种做法:
-
将所有的主题的题目数量存下来。
-
枚举第一场比赛用多少题目,不断地将题目数量 \(\times 2\),判断是否可行。
但是,这种做法有一个问题,时间复杂度过高,所以我们可以将判断是否可行这个步骤用二分来实现,由于每次需要的题目数量都是原来的两倍,所以将专题对应的题目数量从小到大排序后,就具有单调性了。
CF1077F1
题意
给定一个长度为 \(n\) 的序列 \(a\),你需要选择 \(x\) 个元素,使得连续 \(k\) 个元素都至少有一个被选中。
你需要最大化选出来的数之和,并输出。
\(1 \le k, x \le n \le 200\)
\(1 \le a_i \le 10 ^ 9\)
思路
很明显,这题是 dp。
\(dp_{i, j}\) 表示前 \(i\) 个数中,选择 \(j\) 个的最大和。
所以就有转移:
\(dp_{i, j} = \max _ \limits {\max(0, i - k) \le l < i} \{dp_{l, j - 1} + a_i\}\)
时间复杂度为 \(O(n ^ 3)\)。
CF1077F2
题意
给定一个长度为 \(n\) 的序列 \(a\),你需要选择 \(x\) 个元素,使得连续 \(k\) 个元素都至少有一个被选中。
你需要最大化选出来的数之和,并输出。
\(1 \le k, x \le n \le 5000\)
\(1 \le a_i \le 10 ^ 9\)
思路
和上面那题一样,也是 dp。
两道题目基本上没有区别,但是 \(n\) 的范围变大了,也就说明 \(O(n ^ 3)\) 是过不了这道题的。
那么,我们应该怎么优化呢?
因为其实对于 \(dp_{i, j}\) 来说,本质上,它是由最大的 \(dp_{l, j - 1}\) 转移而来的,所以我们可以考虑用单调队列维护。