[Codeforces 484A]Bits(拆位贪心)
2015-06-30 16:25
148 查看
题目链接
http://codeforces.com/problemset/problem/484/A题目大意
求[L,R][L,R]里二进制中1的出现次数最多的数字思路
首先我们把L和R拆成二进制数,然后个位对齐,形如下面这样:R:1100101000011111
L:0000101100000001
假设L和R的二进制里前缀[1,t][1,t]这部分是相同的,那么答案数字x在[1,t][1,t]这部分必须和L和R相同。若之后R全部是1,那么x就可以在之后全部取1,否则x在第t+1位取0,t+2之后全部取1
这个贪心的正确性应该是非常显然的吧
代码
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <algorithm> #define MAXN 110 using namespace std; typedef long long int LL; int numL[MAXN],topL=0,numR[MAXN],topR=0; int numAns[MAXN],topAns=0; int main() { int T; scanf("%d",&T); while(T--) { memset(numL,0,sizeof(numL)); memset(numR,0,sizeof(numR)); LL L,R; scanf("%I64d%I64d",&L,&R); topL=topR=0; while(L) { numL[++topL]=L&1; L>>=1; } while(R) { numR[++topR]=R&1; R>>=1; } topAns=max(topL,topR); int i; for(i=topAns;i>=1;i--) { if(numL[i]==numR[i]) numAns[i]=numL[i]; else break; } bool flag=true; for(int t=i;t>=1;t--) if(numR[t]!=1) { flag=false; break; } if(!flag) { numAns[i]=0; for(int t=i-1;t>=1;t--) numAns[t]=1; } else { for(int t=i;t>=1;t--) numAns[t]=1; } LL ans=0; for(int t=topAns;t>=1;t--) ans=(ans<<1)+numAns[t]; printf("%I64d\n",ans); } return 0; }
相关文章推荐
- JavaWeb学习记录(八)——servlet获取配置信息
- codeforces #257 C称号Jzzhu and Chocolate
- 竞价广告系统-逻辑回归优化方法-L-BFGS
- echarts html传参+js请求+ashx服务 代码方式
- .NET破解之百度网盘批量转存工具
- Freemarker-2.3.22 Demo - No03_使用map绑定多个参数
- Linux档案权限
- 导航栏
- SAT数学高频词汇之数论
- TCP服务器端口转发: netsh
- 磁珠器件的学习
- tomcat下配置https环境
- JavaWeb学习记录(七)——MVC操作数据库增删改查与分页功能
- [LeetCode]#2 Add Two Numbers
- weblogic12
- leetcode 37:Sudoku Solver
- TestNg JAVA 自动化单元测试框架Demo
- TestNg JAVA 自动化单元测试框架Demo
- Freemarker-2.3.22 Demo - No02_绑定单个参数
- 2、javaweb listener 对象的属性变更--监听