HYSBZ - 1192 鬼谷子的錢袋 (思維)

題目鏈接:

https://www.lydsy.com/JudgeOnline/problem.php?id=1192

題目:

Description

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

Input

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

Output

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

Sample Input

3

Sample Output

2

題目大意:

中文題,大概就是說給你一個數,讓你把它差分成幾個部分,使得這些部分能夠組成任何一個小於等於n的數。

題目分析:

首先,能夠表示任意的數 0.0 額 想到了什麼?對,就是2進制,2進制數。任何一個數都有其對應的2進制的形式,並且每一位上非0即1。所以我們就可以按照2進制的方式組合形成任意一個數字。比如1011010就可以有1000000 + 10000 +1000 + 10 組合而成。也就是說如果我們有了 1000 100 10 1 就可以組成小於 1111 的任何的數字。

所以,對於這個題目,我們應該怎麼辦呢?

首先,我們要把這個數分成兩部分 一部分化成2進制是全1的序列,另一部分就是剩下的部分。分好之後,我們來分析一下,是不是可以表示所有的數?首先  < 全1那部分的數,可以按照方纔所說的那種方式組合。那 > 全1那部分的數呢?因爲 全1那部分的數 > 剩下的數(易證 設這個數爲x,並且 2^(n) -1< x < 2^(n-1) -1 則又 2^(n)-2^(n-1) = 2^(n-1) )。所以 > 全1那部分的數 就可以先去掉一個剩下的數,然後在按照剛纔的方式組合。

說起來麻煩,思考一下就明白,其實就是以2爲底的n的對數(向下取整)+1。

代碼:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

int main()
{
    int n;
    cin>>n;
    cout<<(int)log2(n)+1<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章