zoukankan      html  css  js  c++  java
  • BZOJ [HNOI2006]鬼谷子的钱袋

    1192: [HNOI2006]鬼谷子的钱袋

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 5367  Solved: 3646
    [Submit][Status][Discuss]

    Description

    鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政。有一天,他在咸阳游历的时候,朋友告诉他在咸阳最大的拍卖行(聚宝商行)将要举行一场拍卖会,其中有一件宝物引起了他极大的兴趣,那就是无字天书。但是,他的行程安排得很满,他他已经买好了去邯郸的长途马车标,不巧的是出发时间是在拍卖会快要结束的时候。于是,他决定事先做好准备,将自己的金币数好并用一个个的小钱袋装好,以便在他现有金币的支付能力下,任何数目的金币他都能用这些封闭好的小钱的组合来付账。鬼谷子也是一个非常节俭的人,他想方设法使自己在满足上述要求的前提下,所用的钱袋数最少,并且不有两个钱袋装有相同的大于1的金币数。假设他有m个金币,你能猜到他会用多少个钱袋,并且每个钱袋装多少个金币吗?

    Input

    包含一个整数,表示鬼谷子现有的总的金币数目m。其中,1≤m ≤1000000000。

    Output

    只有一个整数h,表示所用钱袋个数

    Sample Input

    3

    Sample Output

    2

    HINT

     

    Source

     
    [Submit][Status][Discuss]


    HOME Back

    题解:找规律得到的,就是k每次右移一位,直到k==0为止,右移多少次就有多少的钱袋;

    其实只要对于前面已经满足条件的数,只要给其增加一个离它最大的数最近的2^n,就可以表示到2*2^n;因此只要统计m是2的多少次方然后加一即可;

    参考代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define clr(a,val) memset(a,val,sizeof a)
     4 #define eps 1e-6
     5 #define PI acos(-1.0)
     6 #define lowbit(x) x&-x
     7 typedef long long ll;
     8 const int INF=0x3f3f3f3f;
     9 int m,h; 
    10 inline int read()
    11 {
    12     int x=0,f=1;char ch=getchar();
    13     while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    14     while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
    15     return x*f;
    16 }
    17 int main()
    18 {
    19     m=read();h=0;
    20     while(m) h++,m>>=1;
    21     printf("%d
    ",h);
    22     return 0;
    23 }
    View Code
  • 相关阅读:
    hdu2818 Building Block
    struct2面试准备
    Spring mvc 面试
    Spring 面试详解
    Java面试必备Springioc上
    redis高级命令4 持久化机制 、事务
    redis高级命令3哨兵模式
    redis高级命令2
    redis高级命令1
    redis基础二----操作set数据类型
  • 原文地址:https://www.cnblogs.com/csushl/p/10066107.html
Copyright © 2011-2022 走看看