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;
}

浙公网安备 33010602011771号