这道题不算难,但开始做的时候心烦意乱,硬是没做出来。出去跑了个步,回来想了一会就ac了,心态啊,你对我是多么重要。
就是一个策略的选取问题,也算是贪心。
对于n中为0的位,贪心的acmer肯定想在这一位上或上1,由于1会使值变大,这时就不用考虑l,只要j或上这一位后比u小,就可以放心得把这一位加到j上。
对于n中为一的位,为了得到最小的j,贪心的acmer肯定想把这一位置为0,这时,不必考虑u,只要置0后不比l小,就可以放心得置为0.。。。。
如此,便得到使N OR J最大的最小j.
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int i;
unsigned n,l,u,j;
while(scanf("%u %u %u",&n,&l,&u)!=EOF)
{
j=0;
for(i=31;i>=0;i--)
{
if((n&(1<<i))==0)//想填1
{
if((j+(1<<i)<=u))
{
j+=(1<<i);
}
}
else//想填0
{
if((j<l)&&(l&(1<<i)))
j+=(1<<i);
}
}
printf("%u\n",j);
}
return 0;
}