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~~

posted @ 2014-11-10 17:21  PJQOOO  阅读(226)  评论(0编辑  收藏  举报