題目:已知N確定一個在區間 [L,U] 上的M,使得N|M的值最大。
分析:貪心。枚舉每個位確定對應結果。
如果不考慮區間 [L,U] ,那麼只要將N取反即可;
下界會影響到M中取0的位置(N中取1的位置),為了保證不小於L,前綴不能小於L的前綴;
上界會影響到M中取1的位置(N中取0的位置),為了保證不大於U,前綴不能大於L的前綴;
說明:一上線發現blog被禁了╮(╯▽╰)╭,賬號被盜了,丟了幾篇文章。
#include <stdio.h>
int main()
{
unsigned int N, L, U, ans;
while (~scanf("%u%u%u",&N,&L,&U)) {
ans = 0U;
for (int i = 31; i >= 0; -- i) {
if ((1U<<i)&N) {
if (ans + (1U<<i) <= L) {
ans = ans + (1U<<i);
}
}else {
if (ans + (1U<<i) <= U) {
ans = ans + (1U<<i);
}
}
}
printf("%u\n",ans);
}
return 0;
}