贪心
杂题
P14125
难度:青
很好的贪心。
我们希望不要溢出,这样会浪费。考虑二分。考虑 \(a_i \le 2\) 怎么做,显然的贪心是往不溢出的怪物尽量放 \(2\),\(2\) 放完就放 \(1\)。肯定是最优的。
考虑有了 \(3\) 怎么做,其实是类似的。我们其实希望构造出尽量多的偶数,这样可以减少浪费。先往 \(\ge 3\) 的奇数扔一个 \(3\) 变成偶数。然后不断往 \(\ge 6\) 的偶数扔两个 \(3\)。如果 \(3\) 不够用,就往最大的数扔,否则只会剩下 \(4,2,1\) 的东西。把 \(3\) 放完之后转化为上面的贪心即可。时间复杂度 \(O(n\log W)\)。
P4025
gp。
对于那些回血的怪显然要先打。打完之后考虑贪心,假设最终的血量为 \(t\),那么在打最后一只怪时,我们希望 \(t' = t - a_i + d_i \ge 0\),显然 \(a\) 更小的情况更优。于是按 \(a\) 降序排即可。可以等价成从后往前回血的过程。
CF436E
按 \(b\) 小到大排序,不妨记最后一个选择两星的位置为 \(p\)。那么 \(p\) 之前的至少选了一颗星。否则可以替换使代价更小。然后 \(p\) 后面的至多选了一颗星。记 \(c_i\) 表示选择 \(i\) 的代价,那么 \(\le p\) 的 \(c_i = b_i - a_i\),\(> p\) 的 \(c_i = a_i\)。贪心选前 \(w - p\) 个即可。可以离散化完在 sgt 上二分。
也可以考虑反贪。考虑当前加一颗星的方式:
- 新开一颗,代价 \(a_i\)。
- 加入一个两星,代价 \(b_i-a_i\)。
- 扔掉前面一个两星,加入一个两星,代价 \(b_i - (b_j - a_j)\)。
- 扔掉前面一个一星,加入一个两星,代价 \(b_i - a_j\)。
需要维护五个堆:
- \(\min a_i(star_i = 0)\)。
- \(\min b_i(star_i = 0)\)。
- \(\min b_i - a_i(star_i = 1)\)。
- \(\min -(b_i - a_i)(star_i=2)\)。
- \(\min -a_i(star_i=1)\)。
注意在改变状态的时候,可能会牵扯到多个堆。注意 pop 掉不合法的状态。
ARC143E
考虑白色叶子显然要先选父亲,黑色要先选儿子。那么建出有向图跑 topo 即可。
CF1599A
考虑 LRLRLR 的特殊情况。显然可以将 \(a\) 小到大排序,一半放左一半放右。这启发我们从最终状态倒推,每次删掉一个元素。如果要求平衡性改变,删掉最大值,不改变就删掉最小值。然后规模缩小继续删。
CF865D
反贪班子。但我咋不会?
考虑一个朴素的贪心。每次考虑股票 \(i\),如果它前面出现了更便宜的 \(j\),就用 \(j\) 卖掉 \(i\)。
但是这样可能存在后面有个 \(k\),而 \(k - j\) 是更优秀的。考虑反悔,在买 \(j\) 卖 \(i\) 时,再多买一个 \(i\)(这个不算进答案里),把 \(i\) 塞进堆里。这样后面再有个 \(k\) 如果取到 \(k-i\),就等价于 \(k-j\)。那么就完成了“反悔”操作。
AGC010D
思考序列的状态。如果有 \(1\) 显然 gcd 就不会变了。如果有奇数个偶数则先手必胜,否则后手必胜。
然后如果有奇数个偶数,先手肯定是有办法让偶数个数为奇数,先手必胜。否则呢?
先手唯一翻盘的机会是让 gcd 除以 \(2\),那么如果存在唯一奇数就递归下去判断。时间复杂度 \(O(n\log V)\)。
浙公网安备 33010602011771号