CodeForces484A Bits(贪心)
2015-06-05 10:16
281 查看
CodeForces484A Bits(贪心)
CodeForces484A
题目大意:给出范围【A,B】,期望你给出某个数X满足X属于【A,B】,并且X转成二进制的1的个数最多。如果有多个给出最小的数。
解题思路:因为需要1最多,那么我们先将每个位都放上1,如果这个数减掉了某一位的1还是超出了范围,那么就可以去掉这个1;如果去掉后发现比A小了,那么这个位置上的1是不能去掉的。直到找到一个数在范围内即为所求的。每次去掉的是高位的1那么在保证1的个数相同的情况下求得的自然是最小的数。
代码:
CodeForces484A
题目大意:给出范围【A,B】,期望你给出某个数X满足X属于【A,B】,并且X转成二进制的1的个数最多。如果有多个给出最小的数。
解题思路:因为需要1最多,那么我们先将每个位都放上1,如果这个数减掉了某一位的1还是超出了范围,那么就可以去掉这个1;如果去掉后发现比A小了,那么这个位置上的1是不能去掉的。直到找到一个数在范围内即为所求的。每次去掉的是高位的1那么在保证1的个数相同的情况下求得的自然是最小的数。
代码:
#include <cstdio> const int maxn = 63; typedef long long ll; int N; ll a, b; ll base[maxn]; ll judge(ll tmp, int pos, int cnt); void init () { base[0] = 1L; for (int i = 1; i < maxn; i++) { base[i] = base[i - 1] * 2L; } } ll handle () { ll ans = base[maxn - 1] - 1; for (int i = maxn - 2; i >= 0; i--) { if (ans - base[i] > b) ans -= base[i]; else if (ans - base[i] >= a && ans - base[i] <= b) return ans - base[i]; } } int main () { scanf ("%d", &N); init(); while (N--) { scanf ("%lld%lld", &a, &b); printf ("%lld\n", handle()); } return 0; }
相关文章推荐
- 黑马程序员--java基础知识点总结
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
- 升级成iOS8后程序不能定位的问题解决
- 线性同余方程初步应用分析
- JAVA之StringBuffer与StringBuilder
- sparkR介绍及安装
- SpringMVC学习系列(3) 之 URL请求到Action的映射规则
- sed直接替换文件内容
- 委比、委差、买一买二买三买四买五
- jQuery实现图片延迟加载
- 16. 3Sum Closest
- IOS开发系列--学习资料整理
- Java NIO系列教程(九) ServerSocketChannel
- eclipse ADT
- Ckeditor通过Ajax更新数据
- fragment添加menu 以及 fragment中调用onActivityResult
- CSUOJ 1635 Restaurant Ratings
- Mysql慢查询配置
- 电脑怎样去除任务栏获取windows10图标?
- PS 图像黑白调整算法(彩色图转灰度图)(VC++)