首页 > 代码库 > C. Bits (Codeforces Round #276 (Div. 2) )

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             else38                 break;39         }40         printf("%I64d\n",ans);41     }42     return 0;43 }

一开始把bits数组定义为int了运行错误,好像是temp+=(bits[j]<<j)这一步位运算爆int 了orz~~

C. Bits (Codeforces Round #276 (Div. 2) )