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