题意:给你D(D<=2^31),s1和s2,求比D大的第一个数并且这个数二进制1的数目在[s1,s2]范围里,输出这个数

思路:直接从D+1算起,如果1的数目>s2那就跳过,如果s1>sum1,那么就将这个数的低位s1-sum1个0补成1,那么就是最优的了



#include<bits/stdc++.h>
using namespace std;
#define LL long long
int a[40];
int main()
{
    int T,cas=1;
	scanf("%d",&T);
	while(T--)
	{
        printf("Case #%d: ",cas++);
		LL d,s1,s2,cnt=0;
		LL sum = 0;
		int pos = 0;
		int flag = 0;
		scanf("%lld%lld%lld",&d,&s1,&s2);
		while(1)
		{
			memset(a,0,sizeof(a));
			pos = 0;
			sum = 0;
			cnt++;
			LL ans = d+cnt;
			while(ans)
			{
                if(ans&1)a[pos]=1,sum++;
				else a[pos]=0;
				pos++;
				ans>>=1;
			}
            if(sum>s2)continue;
			if(sum>=s1&&sum<=s2)
			{
				printf("%lld\n",cnt+d);
				flag = 1;
				break;
			}
			int b = s1-sum;
			int j = 0;
            while(b)
			{
                if(a[j]==0)
				{
					a[j]=1;
					b--;
				}
				j++;
			}
			break;
		}
		LL ans = 0;
		LL temp = 1;
        if(!flag)
		{
            for(int i = 0;i<40;i++)
			{
				if(a[i])
					ans+=temp;
				temp<<=1;
			}
		}
		if(!flag)
		   printf("%lld\n",ans);
	}
}


HDU 5491 The Next(构造)_i++