好题好题。
如果有三个 \(0\),直接消除是非常优的,如果我们有三个 \(1\),操作填满是非常劣的。
那么剩下的情况都是两 \(1\) 一 \(0\),或者两 \(0\) 一 \(1\),此时我们可以看作是一个 \(1\) 和一个 \(0\) 进行抵消。
考虑下面的情况 00100
,在这样的情况下,我们一定会把 \(1\) 前面的 \(0\) 抵消,使得剩下的 \(0\) 和后面的两个 \(0\) 进行合并。
那么我们可以假设当前有一个栈。
加入 \(0\) 后,若栈里面有三个 \(0\) 了,直接消除两个。
加入 \(1\) 后,若 \(1\) 前面有一个 \(0\),那么直接抵消是不劣的,否则直接加入。
注意到这样的贪心下 \(1\) 一定在 \(0\) 下面。
最后要求 \(1\) 的数量大于 \(0\) 的数量,若 \(1\) 的数量已经大于 \(2\) 了,可以直接当作两个,因为 \(0\) 的个数不会超过 \(2\),结合 \((2,2)\) 的情况不会存在,我们只需要记录 \(1\) 的数量 $\in \set{0,1,2} $ 即可,时间复杂度 \(O(n)\)。