加载中...

牛客周赛99 F(贪心思维好题)

F

题意很简单:\(m\) 个正整数,总和恰好为 \(n\),求按位与的最大值。

首先不难想到贪心:贪心地让可以全填充 \(1\) 的最高二进制位都填 \(1\),这样一定是最优的。设当前在决策第 \(bit\) 个二进制位,则只要满足:

\[n >= m * (1<<bit) \]

即可将第 \(bit\) 个二进制位均填 \(1\)

那么若遇到另一种情况,即 \(n < m * (1<<bit)\) 时,应当如何填充?这是本题的关键。

很容易地去想:避免浪费,该位全填 \(0\) 不就好了?这个想法是错误的。因为这并不是我们想全填 \(0\) 就能全填 \(0\) 的。当有以下关系时:

\[n > m * ((1<<bit)-1) \]

事情便不会如我们所愿,因为当该位的后面已经全部填充了 \(1\) 后,还会剩下一些数字。此时无论填哪个数,都会存在进位,那么该位无论如何也不能做到全 \(0\),也就是该位必然出现 \(1\)

那么应该填几个 \(1\) 呢?这也很容易想到:填 \(1\) 的数量逐渐加 \(1\),直到剩下的数量能够被该位之后全部容纳即可。具体式子为(假设答案为 \(k\)):

\[n - k*(1<<bit) <= m * ((1<<bit)-1) \]

化简后得到:

\[k = \lceil \frac{n - m * ((1<<bit) - 1)}{1<<bit} \rceil \]

而若 \(n <= m * ((1<<bit)-1)\),那么该位就可以是全 \(0\),此时就可以本着“不浪费”的原则直接看下一位。至此全部情况已分析完毕。具体细节见代码。

code

posted @ 2025-07-07 23:12  jxs123  阅读(14)  评论(0)    收藏  举报