HDU 5491 The Next
Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two integers S1 and S2, we call D a WYH number if S1≤L≤S2.
With a given D, we would like to find the next WYH number Y, which is JUST larger than D. In other words, Y is the smallest WYH number among the numbers larger than D. Please write a program to solve this problem. Input The first line of input contains a number T indicating the number of test cases (T≤).
Each test case consists of three integers D, S1, and S2, as described above. It is guaranteed that ≤D< and D is a WYH number. Output For each test case, output a single line consisting of “Case #X: Y”. X is the test case number starting from . Y is the next WYH number. Sample Input Sample Output Case #:
Case #:
Case #: Source ACM/ICPC Asia Regional Hefei Online
这道题在比赛的时候我就是用的这个方法,但是一直超时。后来重新写了一遍,用了G++过了。
思路:
从小到大找必定超,我看限制条件一的个数是0~32差不多,这么个循环是不会超时的。我就从i->s1~s2循环,里面找一的个数为i的。
这里因为要i个1,然后又要比L大那么把第i个1前移一位。
下面这里分两个情况:
以需要3个1为例
①11011->11100
②10111->11001如果进位了,就在末尾补1.
还有一种情况就是找不到第i个1:就从后往前变0为1,直到满足i个1.
然后去每种1个数的最小值。
证明正确性:
试想要i个1那么不够的话还要比他大是不是往后补就行,因为1放在越后面越小。
要是够,因为要比他大,这里可知1的个数比需要的多。我们就要删掉1,那么删哪些呢?到第i个1为止,你后面在怎么变①后面1变少,数值变小,不行②1变多,我们现在要删掉1,不行;
所以后面的都不行,那么第i个1要进位了。然后进位完,1不够了,最小就往最后面补。
#include<stdio.h>
int main()
{
int T,s1,s2;
__int64 L,p;
int cas=; scanf("%d",&T);
while(T--)
{
scanf("%I64d%d%d",&L,&s1,&s2);
p=(__int64)<<; if(L==&&s1==&&s2==){
printf("Case #%d: 0\n",++cas);
continue;
}
int flag=;
__int64 t;
for(int i=s1;i<=s2;i++)
{
int s=,f=;
t=(__int64);
for(int j=;j>=;j--)
{
if(L&((__int64)<<j))s++;
if(s==i)
{
int z,k;
for(k=j;k<=;k++)
{if(L&((__int64)<<k));
else {
t|=(__int64)<<k;
break;
}
} z=;
for(int kk=k+;kk<=;kk++)
{
if(L&((__int64)<<kk))t|=(__int64)<<kk,z++;
}
z=i-z;
for(k=;k<=&&z>;k++)t|=(__int64)<<k,z--;
p=p>t?t:p; f=;
break;
}
}
if(!f)
{
s=i-s;
t=L;
for(int k=;k<=&&s>;k++){
if(L&((__int64)<<k));
else t|=(__int64)<<k,s--;
}
p=p>t?t:p; } }
printf("Case #%d: %I64d\n",++cas,p);
}
}
HDU 5491 The Next的更多相关文章
- hdu 5491 The Next (位运算)
http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意:给定一个数D,它的二进制数中1的个数为L,求比D大的数的最小值x且x的二进制数中1的个数num满 ...
- 【贪心】【模拟】HDU 5491 The Next (2015 ACM/ICPC Asia Regional Hefei Online)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5491 题目大意: 一个数D(0<=D<231),求比D大的第一个满足:二进制下1个个数在 ...
- hdu 5491(2015合肥网赛)The Next
题目;http://acm.hdu.edu.cn/showproblem.php?pid=5491 题意就是,T组测试数据.然后L,S1,S2.L的二进制中有x个1,x满足 S1<=x< ...
- HDU 5491 The Next(位运算)
题意:已知D(0<=D<2^31).s1.s2,其中L为D转化为二进制数时1的个数,题目保证s1<=L<=s2,求一个数,满足以下条件: 1.比D大 2.转化为二进制时1的个数 ...
- hdu 5491 The Next(暴力枚举)
Problem Description Let L denote the number of 1s in integer D’s binary representation. Given two in ...
- hdu 5491(位运算)
题意:给你n,a,b. 希望得到比n大,二进制1的个数在 a ,b之间的最小的数 思路:①满足条件,输出 ②num < a 从右找到是0的最小位,变成1 ③num > b从右到左找是1的最 ...
- HDU - 5491 The Next 2015 ACM/ICPC Asia Regional Hefei Online
从D+1开始,对于一个数x,区间[x,x+lowbit(x))内的数字的二进制位上1的数量整体来说是单调不减的,因此可快速得出1在这个区间的取值范围. 每次判断一下有没有和[s1,s2]有没有交集,一 ...
- HDOJ 2111. Saving HDU 贪心 结构体排序
Saving HDU Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 【HDU 3037】Saving Beans Lucas定理模板
http://acm.hdu.edu.cn/showproblem.php?pid=3037 Lucas定理模板. 现在才写,noip滚粗前兆QAQ #include<cstdio> #i ...
随机推荐
- [转]Angular, Backbone, or Ember: Which is Best for your Build?
In order to choose which framework is right for your build, we've asked four important questions of ...
- RGB Bayer Color分析
RGB Bayer Color分析 Bayer色彩滤波阵列 拜耳色彩滤波阵列(Bayer Color Filter Array,CFA)是非常有名的彩色图片的数字采集格式.色彩滤波器的模式如上图所示, ...
- 数据库分页--MySQL数据库
关于实现MySQL分页的最简单的方法就是利用mysql数据库的limit函数:limit [offset,] rows SELECT * FROM 表名称 LIMIT M,N limit 子句可以被用 ...
- patch与diff的恩怨
一.概述 diff和patch是一对相辅相成的工具,在数学上来说,diff类似于对两个集合的差运算,patch类似于对两个集合的和运算.diff比较两个文件或文件集合的差异,并记录下来,生成一个dif ...
- 如何在 CentOS 7 上安装 Redis 服务器
大家好,本文的主题是 Redis,我们将要在 CentOS 7 上安装它.编译源代码,安装二进制文件,创建.安装文件.在安装了它的组件之后,我们还会配置 redis ,就像配置操作系统参数一样,目标就 ...
- coco2dx 精灵类
CCSize size = CCDirector::sharedDirector()->getWinSize(); CCSprite *bg = CCSprite::create("H ...
- jsp中的forward和redirect的区别
转自http://blog.163.com/tsing_hua/blog/static/139622224201101110836644/ 一.调用方式 我们知道,在servlet中调用转发.重定向的 ...
- indexOf()不区分大小写用法
str.toLowerCase().indexOf(str.toLowerCase())>=0; 对字符串进行统一小写转换. indexOf()查找到返回索引值大于=0; 未找到,返回-1; i ...
- javascript如何监听页面刷新和页面关闭事件
本文转之http://www.qqtimezone.top 在我们的日常生活中,时常遇到这么一种情况,当我们在点击一个链接.关闭页面.表单提交时等情况,会提示我们是否确认该操作等信息. 这里就给大家讲 ...
- asp.net redis 实战
当开始用 var result=new RedisClient("127.0.0.1",6379,1"1111"); 这个helper ,后面有并发之后 ...