【HDU】5491 The Next(2015 ACM/ICPC Asia Regional Hefei Online)
2016-07-12 10:13
441 查看
The Next
题目链接
The Next题目大意
规定一种数叫做WYH数,其二进制中1的个数在s1,s2之间,现在给你一个WYH数,要你求比他大的WYH数中最小的一个(就是下一个WYH数)题解
构造
其实这一题挺有意思的…考虑比D大1的数D+1,先算出D+1中1的个数L,然后分情况讨论:
如果L大于S2
因为我们现在要减少1的个数,而且我们现在只能加,所以考虑二进制中的最后一个1,只有让这一位向前进位,我们才能减少1的个数,所以对于这种情况,我们先找出最后一个1所在的位置,然后把该位的1向前进位。
如果L小于S1
这个好说,我们从二进制的最右边向左边扫,把遇到的0全部变成1,知道满足条件为止。
代码
#include <iostream> #include <cstring> #include <cstdio> #define LL long long using namespace std; int T,s1,s2; LL d; int num(LL a) { int ans=0; for (int i=0;i<32;i++) if ((1<<i)&a) ans++; return ans; } int main() { int Case=1; scanf("%d",&T); while (T--) { scanf("%I64d%d%d",&d,&s1,&s2); d++; int l=num(d); printf("Case #%d: ",Case++); if (l>=s1 && l<=s2) { printf("%I64d\n",d); continue ; } while (1) { if (l<s1) { for (int i=0;i<32;i++) if (((1<<i)&d)==0) { d=d|(1<<i); l++; if (l==s1) break; } printf("%I64d\n",d); break; } if (l>s2) { for (int i=0;i<32;i++) if ((1<<i)&d) { d+=(1<<i); break; } l=num(d); if (l>=s1 && l<=s2) { printf("%I64d\n",d); break; } } } } return 0; }
相关文章推荐
- JS函数和变量名称冲突
- jquery插件讲解:轮播(SlidesJs)+验证(Validation)
- Jquery实现全选和反选并获取选中行
- 剑指offer----调整数组顺序使奇数位于偶数前面----java实现
- Caffe使用step by step:caffe框架下的基本操作和分析
- 【BZOJ1030】[JSOI2007]文本生成器
- 基于ArcGIS JS API的在线专题地图实现
- H5上传图片前端预览显示
- 添物不花钱学javaEE--CSS
- 添物不花钱学javaEE--CSS
- SCSS Invalid US-ASCII character 处理
- Butter Knife 使用方法
- 多功能jQuery树插件zTree实现权限列表简单实例
- Bootstrap 中的 Typeahead 组件 -- AutoComplete
- JavaScript Tab切换
- JavaScript
- 关于HTML5语义标签的实践(blog页面)
- 基于BootStrap环境写jQuery tabs插件
- 【HDU】5492 Find a path(2015 ACM/ICPC Asia Regional Hefei Online)
- Jquery表单验证