BZOJ 1192 [HNOI2006]鬼谷子的钱袋

【题解】

  显然把m拆分成2的幂之和可以做到拼凑出1~m的任意数并且钱袋最少

  

#include<cstdio>
#include<algorithm>
#define rg register
#define lowbit (n&-n)
using namespace std;
int n,ans,a[31];
inline int read(){
	int k=0,f=1; char c=getchar();
	while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
	while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
	return k*f;
}
int main(){
	n=read(); a[0]=1;
	for(rg int i=1;i<=30;i++) a[i]=a[i-1]<<1;
	for(rg int i=0;i<=30;i++) if(a[i]>n){
		printf("%d\n",i);
		return 0;
	}
	return 0;
}

  

posted @ 2018-02-28 18:09  Driver_Lao  阅读(128)  评论(0编辑  收藏  举报