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

1192: [HNOI2006]鬼谷子的錢袋

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 3606  Solved: 2622
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

3

Sample Output

2

HINT

Source

[Submit][Status][Discuss]
題解:SB題,用二進制思想,這讓我想起塗答題卡的考號,這tmHNOI別騙我。
貼上代碼:
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<ctime>
#include<queue>
using namespace std;

inline int read()
{
	int x = 0 , f = 1; char ch = getchar();
	while(ch<'0'||ch>'9'){if(ch=='-') f= -1; ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+(ch-'0');ch=getchar();}
	return x * f;
}

int main()
{
	int m = read() , s = 1;
	for(int i=1;;i++)
	{
		s*=2;
        if(s>m){printf("%d",i);break;}	
	}
	return 0;	
}

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