C. Bits (Codeforces Round #276 (Div. 2) )
题目大意:给你两个数l,r(l<r),求一个数是大于等于l且小于等于r的数中二进制数的1的个数最多,如果1的个数相同则取最小的那个(翻译渣,请见谅!)
思路:把左区间L化为二进制,再把左区间的二进制的从最小位开始,每位变为1,因为这是在当前1的个数中最小的且大于L的。条件是小于等于右区间R。
代码:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <stdio.h> 5 #include <cstring> 6 #include<algorithm> 7 using namespace std; 8 __int64 bits[100]; 9 int main() 10 { 11 int t; 12 __int64 l,r; 13 scanf("%d",&t); 14 while(t--) 15 { 16 __int64 ans; 17 memset(bits,0,sizeof(bits)); 18 scanf("%I64d%I64d",&l,&r); 19 ans=l; 20 int i=0; 21 while(l>0) 22 { 23 bits[i++]=(l%2); 24 l=l/2; 25 } 26 int len=i; 27 for(i=0;; i++) 28 { 29 bits[i]=1; 30 __int64 temp=0; 31 for(int j=0; j<max(len,i+1); j++) 32 { 33 temp+=(bits[j]<<j); 34 } 35 if(temp<=r) 36 ans=temp; 37 else 38 break; 39 } 40 printf("%I64d\n",ans); 41 } 42 return 0; 43 }
一开始把bits数组定义为int了运行错误,好像是temp+=(bits[j]<<j)这一步位运算爆int 了orz~~
————Anonymous.PJQ