..

AcWing 998. 起床困难综合症

题目链接:998. 起床困难综合症 - AcWing题库

本题让我们选择 $[0, m]$ 之间的一个整数 $x_0$,经过给定的 $n$ 次位运算,使结果 $ans$ 最大。

位运算的主要特点之一是在二进制表示下不进位

正因如此,在 $x_0$ 可以任意选择的情况下,参与位运算的各个位(bit)之间是独立无关的。

换言之,对于任意的 $k (0 \leq k < 30)$,“$ans$ 的第 $k$ 位是几” 只与 “$x_0$ 的第 $k$ 位是几” 有关,与其他位无关。

所以我们可以从高位到地位,依次考虑 $x_0$ 的每一位填 $0$ 还是填 $1$。

$x_0$ 的第 $k$ 位应该填 $1$,当且仅当同时满足下列两个条件。

  1. 已经填好的更高位构成的数值加上 $1 « k$ 以后不超过 $m$。
  2. 用每个参数的第 $k$ 位参与位运算。若初值为 $1$,则 $n$ 次位运算后结果位 $1$;若初值为 $0$,则 $n$ 次位运算后结果为 $0$。

如果不满足上述条件,要么填 $1$ 会超过 $m$ 的范围,要么填 $1$ 不如 $0$ 更优。

这种情况下令 $x_0$ 的第 $k$ 位为 $0$ 显然更好。

确定 $x_0$ 的每一位以后,自然可以得到 $ans$ 的值。

完整代码:起床困难综合症.cpp