1192: [HNOI2006]鬼谷子的钱袋

来源:互联网 发布:linux查看磁盘占用情况 编辑:程序博客网 时间:2024/04/29 09:08

题目链接

题目大意:用x个数表示出1-m的数,求x最小是多少

题解:对于一个要凑的金币数目m,如果我们有了m/2的钱袋并能凑出任何1~m/2-1的金币数目,我们就能凑出m/2+1~m-1的金币数目。
然后就能推出只需要装有2的幂次方金币数目的钱袋。
结论:2^0–2^(n-1)可以组合出[0,2^n)内所有整数

我的收获:二进制思想还是比较机智的

#include <iostream>#include <cstdio>#include <algorithm>using namespace std;int n;void work(){    int x,s;     for(x=1,s=1;(s<<1)<=n;x++,s<<=1);//分号表示循环的语句结束     cout<<x<<endl;}void init(){    cin>>n;}int main(){    init();    work();    return 0;}
0 0