[Leaf] [ZJ2022L] Candy Machine
zj2022l---candy-machine">ZJ2022L - Candy Machine
1. 题面梗概
给定 个糖果,第 个糖果甜度为 ,可以取任意子集的糖果。限制条件是,选取完某个糖果子集 后,设平均甜度为 ,所有甜度 严格大于 的糖果可以得到。问:最多可以获得多少糖果。
2. 逻辑推导
2.1 切入点
切入点是这个:“平均甜度 ”,如果我们想取得更多的糖果,那么最简单的想法就是降低平均值 。接着分析,如果想要平均值小,那么子集中不属于我的“糖果”的甜度应该越小越好。
那么对于一个固定大小为 的子集,如果要让满足条件的糖最多,显然就是取甜度最小的 颗糖。
为什么?如果把其中某颗糖换成一个更甜的糖果,子集的平均值 只会变大,对于原本这个子集来说,满足条件的糖数量显然不会增加。
2.2 建模
我们按照贪心将甜度从小到大排序:,枚举每一个前缀子集,然后统计更新答案即可。
这样的复杂度肯定不正常,会 TLE,接着观察,我们发现满足条件的永远是,当前前缀子集的后一部分。
那么不妨用双指针维护这个区间计数,随着 的增加, 肯定是单调递增的,那么第一个满足 的下标 也会随之向右移动,因此维护这个 指针即可。
3. 代码实现
▶
AcCode
1 | |
4. 复盘
[Leaf] [ZJ2022L] Candy Machine
http://miqiu.space/posts/3cde2f28/