BZOJ [HNOI2006]鬼谷子的錢袋
阿新 • • 發佈:2018-12-04
1192: [HNOI2006]鬼谷子的錢袋
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5367 Solved: 3646
[Submit][Status][Discuss]
Description
鬼谷子非常聰明,正因為這樣,他非常繁忙,經常有各諸侯車的特派員前來向他諮詢時政。有一天,他在咸陽遊歷的時候,朋友告訴他在咸陽最大的拍賣行(聚寶商行)將要舉行一場拍賣會,其中有一件寶物引起了他極大的興趣,那就是無字天書。但是,他的行程安排得很滿,他他已經買好了去邯鄲的長途馬車標,不巧的是出發時間是在拍賣會快要結束的時候。於是,他決定事先做好準備,將自己的金幣數好並用一個個的小錢袋裝好,以便在他現有金幣的支付能力下,任何數目的金幣他都能用這些封閉好的小錢的組合來付賬。鬼谷子也是一個非常節儉的人,他想方設法使自己在滿足上述要求的前提下,所用的錢袋數最少,並且不有兩個錢袋裝有相同的大於1的金幣數。假設他有m個金幣,你能猜到他會用多少個錢袋,並且每個錢袋裝多少個金幣嗎?
Input
包含一個整數,表示鬼谷子現有的總的金幣數目m。其中,1≤m ≤1000000000。
Output
只有一個整數h,表示所用錢袋個數
Sample Input
3Sample Output
2HINT
Source
題解:找規律得到的,就是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()View Code11 { 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\n",h); 22 return 0; 23 }