hdu5491
2016-02-14 23:40
260 查看
这道题我服了……
我是想模拟来着……
弄巧成拙了….
我一开始是想….
好吧我是程序员 坦白一点 这道题做起来没一点思路 看了别个的解题报告写的
TAT
QAQ
其实思想很简单 就是你要求的是比n大的数 首先加1 如果1的个数sum大于s2 那么你就想办法去掉一个数
找到最低位的1 变成0 重点来了 也是卡住我的地方 最低位的1 变成0 其实就是加上(1<<(i-1))这个数 因为你加上这个数 这一位会变成0
有人问了 那这个数不是会很大吗?
我们要求的数 本来就要比n大 大多少呢 要根据题目s1 s2的数据决定 现在你的数目要比s2大 所以你要少一个1 才行 但是怎么办呢 直接去掉? 不行 那你的数可能会比n小 所以你只能加上最低位1 的这个数
(1<<(i-1)) 这样也可以保证你求的数是比n大的数中最小的
那要是sum比s1还小呢 不是同样的道理吗?
我是想模拟来着……
弄巧成拙了….
我一开始是想….
好吧我是程序员 坦白一点 这道题做起来没一点思路 看了别个的解题报告写的
TAT
QAQ
其实思想很简单 就是你要求的是比n大的数 首先加1 如果1的个数sum大于s2 那么你就想办法去掉一个数
找到最低位的1 变成0 重点来了 也是卡住我的地方 最低位的1 变成0 其实就是加上(1<<(i-1))这个数 因为你加上这个数 这一位会变成0
有人问了 那这个数不是会很大吗?
我们要求的数 本来就要比n大 大多少呢 要根据题目s1 s2的数据决定 现在你的数目要比s2大 所以你要少一个1 才行 但是怎么办呢 直接去掉? 不行 那你的数可能会比n小 所以你只能加上最低位1 的这个数
(1<<(i-1)) 这样也可以保证你求的数是比n大的数中最小的
那要是sum比s1还小呢 不是同样的道理吗?
#include<cstdio> #include<cstring> typedef long long ll; ll get(ll x){ ll sum=0; while(x){ if(x&1)sum++; x>>=1; } return sum; } ll min(ll a_,ll b_){ return a_>b_?b_:a_; } int main(){ int T; scanf("%d",&T); int coun__=1; while(T--){ ll n; ll x,y; scanf("%lld%lld%lld",&n,&x,&y); printf("Case #%d: ",coun__++); ll ans=n+1; while(1){ ll sum=get(ans); if(sum>y){ ll k=0,temp_=ans; while(temp_){ if(temp_&1){ans+=(1<<k);break;} k++; temp_>>=1; } } else if(sum<x){ ll k=0,temp_=ans; while(temp_){ if(!(temp_&1)){ans+=(1<<k);break;} k++; temp_>>=1; } } else break; } printf("%lld\n",ans); } }
相关文章推荐
- UVA 1586
- poj2777 Count Color
- 为什么java读取sqlserver2008中的date数据类型的数据比实际的少2天?
- 第一天(2016.01.11)
- ANDROID_MARS学习笔记_S01原始版_010_ContentProvider
- NSMutableString可变字符串
- POJ 3468 树状数组
- poj 1419(求最大独立集)
- 王学岗仿QQ页面滑动
- lasrevarTredrOlevlLeerTyraniB.102
- (转)js一道比较考验的题目
- 自己实现下载框架(三)
- 【HDOJ】4605 Magic Ball Game
- POJ 2892 线段树(连续问题)
- 数值的整数次方
- JavaScript的单元测试
- post 发送xml
- 小雷郑重承诺:在2017年之前,对大学毕业4年以来的所有努力和探索,做一个全面客观的总结,技术研究、工作创业、投资理财、朋友感情等
- 小雷郑重承诺:在2017年之前,对大学毕业4年以来的所有努力和探索,做一个全面客观的总结,技术研究、工作创业、投资理财、朋友感情等
- 【SPOJ-PRIME1】Prime Generator【区间质数筛】