1. 程式人生 > >BZOJ-1192-[HNOI2006]鬼谷子的錢袋

BZOJ-1192-[HNOI2006]鬼谷子的錢袋

rip desc 咨詢 closed 大於 noi int its 結束

Description

鬼谷子非常聰明,正因為這樣,他非常繁忙,經常有各諸侯車的特派員前來向他咨詢時政。有一天,他在鹹陽遊歷的時候,朋友告訴他在鹹陽最大的拍賣行(聚寶商行)將要舉行一場拍賣會,其中有一件寶物引起了他極大的興趣,那就是無字天書。但是,他的行程安排得很滿,他他已經買好了去邯鄲的長途馬車標,不巧的是出發時間是在拍賣會快要結束的時候。於是,他決定事先做好準備,將自己的金幣數好並用一個個的小錢袋裝好,以便在他現有金幣的支付能力下,任何數目的金幣他都能用這些封閉好的小錢的組合來付賬。鬼谷子也是一個非常節儉的人,他想方設法使自己在滿足上述要求的前提下,所用的錢袋數最少,並且不有兩個錢袋裝有相同的大於1的金幣數。假設他有m個金幣,你能猜到他會用多少個錢袋,並且每個錢袋裝多少個金幣嗎?

Input

包含一個整數,表示鬼谷子現有的總的金幣數目m。其中,1≤m ≤1000000000。

Output

只有一個整數h,表示所用錢袋個數

Sample Input

3

Sample Output

2

題解

這道題就是要你分一些錢到錢袋,使得1~m中任意一個數都能由某幾個錢袋中的錢表示出來

我們考慮到把m轉化成二進制

第一個錢袋放二進制為1的錢,第二個放二進制為10的錢,第三個放二進制為100的錢,以此類推,這樣到最後會剩下一個數(>=0)

不難得到1~m中的任意數都可以表示出來,這樣錢袋的數量就是第一個大於m的 2的倍數 的二進制位數

技術分享
1 #include<bits/stdc++.h>
2
using namespace std; 3 int n; 4 int main(){ 5 scanf("%d",&n); 6 int m=floor(log(n)/log(2))+1; 7 printf("%d\n",m); 8 return 0; 9 }
View Code

BZOJ-1192-[HNOI2006]鬼谷子的錢袋