题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5491
题目大意:
一个数D(0<=D<231),求比D大的第一个满足:二进制下1个个数在[s1,s2]范围内。D已经满足[s1,s2]。
题目思路:
【贪心】【模拟】
首先将这个数转成二进制统计总共1的个数s,再求出末尾连续0和1的个数n0,n1。
如果最后一位是0:
s=s2,那么为了保证s<s2且答案>D,先设ans=d+lowbit(d),此时满足了新的s<s2且答案>D,但这时有可能s<s1,需要从最低位开始补1。
s<s2,那么ans=n+1为答案。
如果最后一位是1:先ans=n+1在看新的s(s只减不增)
s<s1,那么从最低位开始补1。
否则,ans即为答案
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 2 //by coolxxx 3 //#include<bits/stdc++.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<string> 7 #include<iomanip> 8 #include<map> 9 #include<stack> 10 #include<queue> 11 #include<set> 12 #include<bitset> 13 #include<memory.h> 14 #include<time.h> 15 #include<stdio.h> 16 #include<stdlib.h> 17 #include<string.h> 18 //#include<stdbool.h> 19 #include<math.h> 20 #define min(a,b) ((a)<(b)?(a):(b)) 21 #define max(a,b) ((a)>(b)?(a):(b)) 22 #define abs(a) ((a)>0?(a):(-(a))) 23 #define lowbit(a) (a&(-a)) 24 #define sqr(a) ((a)*(a)) 25 #define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b)) 26 #define mem(a,b) memset(a,b,sizeof(a)) 27 #define eps (1e-8) 28 #define J 10000 29 #define mod 1000000007 30 #define MAX 0x7f7f7f7f 31 #define PI 3.14159265358979323 32 #define N 44 33 using namespace std; 34 typedef long long LL; 35 int cas,cass; 36 int n,m,lll,ans; 37 LL aans; 38 LL e[N]; 39 int a[N]; 40 int s,s1,s2,n0,n1; 41 void init() 42 { 43 int i; 44 e[0]=1; 45 for(i=1;i<32;i++)e[i]=e[i-1]<<1; 46 } 47 int main() 48 { 49 #ifndef ONLINE_JUDGE 50 // freopen("1.txt","r",stdin); 51 // freopen("2.txt","w",stdout); 52 #endif 53 int i,j,k; 54 init(); 55 // for(scanf("%d",&cass);cass;cass--) 56 for(scanf("%d",&cas),cass=1;cass<=cas;cass++) 57 // while(~scanf("%s",s+1)) 58 // while(~scanf("%d",&n)) 59 { 60 scanf("%d%d%d",&n,&s1,&s2); 61 s=n1=n0=0;mem(a,0); 62 m=n; 63 if(n==0)a[0]=1; 64 while(m) 65 { 66 a[++a[0]]=m&1; 67 s+=m&1; 68 m>>=1; 69 } 70 if(a[1]==0) 71 { 72 for(i=1;i<=a[0] && a[i]==0;i++)n0++; 73 for(;i<=a[0] && a[i]==1;i++)n1++; 74 if(n0) 75 { 76 if(s==s2) 77 { 78 aans=1LL*n+lowbit(n); 79 s=s+1-n1;n0+=n1; 80 if(s<s1) 81 { 82 for(i=0;i<s1-s;i++) 83 aans+=e[i]; 84 } 85 } 86 else 87 { 88 aans=1LL+n; 89 } 90 } 91 } 92 else 93 { 94 for(i=1;i<=a[0] && a[i]==1;i++)n1++; 95 for(;i<=a[0] && a[i]==0;i++)n0++; 96 s=s+1-n1; 97 aans=1LL+n; 98 if(s<s1) 99 { 100 for(i=0;i<s1-s;i++) 101 aans+=e[i]; 102 } 103 } 104 printf("Case #%d: %lld ",cass,aans); 105 } 106 return 0; 107 } 108 /* 109 // 110 111 // 112 */