Loading

CF1077

CF1077E

题意

Polycarp 有 \(n\) 个问题,问题的主题分别是 \(a_1, a_2, \dots, a_n\),Polycarp 需要组织一些专题比赛,同时要满足以下条件:

  • 一场专题比赛中的所有题目的主题相同

  • 组织的所有专题比赛中主题互异

  • 从第二场比赛开始,比赛中的题目数必须是前一场比赛题目数量的 \(2\) 倍,第一场比赛的题目数量可以是任意的

  • 所有比赛使用的题目数量之和最大

求所有比赛使用的题目数量之和的最大值。

注意:不需要使比赛的数量最大,不一定需要使用所有的题目,不一定需要使用所有的主题。

思路

我们考虑用一个桶来记录所有专题的题目数量。

因为专题的值高达 \(10 ^ 9\),需要离散化一下。

所以就有一种做法:

  1. 将所有的主题的题目数量存下来。

  2. 枚举第一场比赛用多少题目,不断地将题目数量 \(\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}\) 转移而来的,所以我们可以考虑用单调队列维护。

posted @ 2023-03-23 21:58  chengning0909  阅读(16)  评论(0编辑  收藏  举报