首页 > 代码库 > 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) )
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。