Loading

12.26 CW 模拟赛 T2. 操作

思路


赛时想到的部分:

这个题和之前做过的一题很像, 说不定可以冲正解?

唯一的区别就是差 , 而且每次可以 \(\pm k\)
分数组第一位一定要是 \(0\)
你发现在序列之中匹配完了之后, 剩下 \(k\) 个数就要做 \(k\) 次操作

如果匹配了 \(i\) 对, 剩下来 \(k\) 个数, 总花费为 \(k + i\)

你发现时间复杂度给的可以放过 \(\mathcal{O} (n 2^n)\) , 往这个方向想

你又发现一次操作至少可以消掉一个数, 那么肯定是尽可能匹配优先

\(\rm{dp}\) 的方法做, 差不多会了, 一会继续推, 实在太难受了先打暴力


好的, 实际上直到这里都非常正确

容易发现一次操作至少可以清零一个位置, 而匹配操作可以更优

对于匹配操作, 一定是取出数列的一个集合, 其中集合内和为 \(0\) , 这样子可以省下操作次数, 那么我们一定优先匹配

所以我们可以将这个问题转化成寻找尽量多尽量小的集合, 满足集合内和为 \(0\) 且不存在子集内和为 \(0\) , 假设数量为 \(k\) 就可以省掉 \(k\) 个操作, 这个不消说

那么怎么解决这个问题

根据时间复杂度你也要考虑状压, 令 \(dp_{\mathbb{S}}\) 表示选择了 \(\mathbb{S}\) 中的点, 最多选出的集合数

显然的我们可以挨个尝试加入, 只要子集和变成 \(0\) 了证明出现了新的最小集合, 那么转移一下即可

具体的

\[dp_{\mathbb{S}} \gets dp_{\mathbb{S}^{\prime}} + \left[sum = 0\right] \]

其中 \(\mathbb{S}^{\prime}\)\(\mathbb{S}\) 差了一位 \(1\) , \(sum\) 表示选择点的和

总结

转化问题的能力还不够, 还得多练

差分数组的常见性质

这个题最优的 \(\rm{dp}\) 就算想不到, 也应该推出比较好的 \(\rm{dp}\)

posted @ 2024-12-26 16:23  Yorg  阅读(11)  评论(0)    收藏  举报