贪心
因为 $a_i\geq 0$,所以明显多选不亏。
可以从高到低位考虑,改动原来的数必须往小了改,所以改动的最高位必须是 $1$ 改成 $0$。如果选择将某一个 $1$ 变为 $0$,那么后面的数无论怎么改都是小于原数的,所以全部填上 $1$ 就可以了。
所以具体来说做一个从低位到高位的前缀和,枚举每一个为 $1$ 的位,高位记录从后面到这一位的答案,低位查询前缀和得到改变这一位的答案,取最大值输出即可。
时间复杂度 $O(n)$。
代码:
1 | #include<cstdio> |
因为 $a_i\geq 0$,所以明显多选不亏。
可以从高到低位考虑,改动原来的数必须往小了改,所以改动的最高位必须是 $1$ 改成 $0$。如果选择将某一个 $1$ 变为 $0$,那么后面的数无论怎么改都是小于原数的,所以全部填上 $1$ 就可以了。
所以具体来说做一个从低位到高位的前缀和,枚举每一个为 $1$ 的位,高位记录从后面到这一位的答案,低位查询前缀和得到改变这一位的答案,取最大值输出即可。
时间复杂度 $O(n)$。
代码:
1 | #include<cstdio> |