题意:给出一个数n,问最少多少个数可以组成从1到n的所有数。
题解:显而易见,把问题转化成二进制问题就可以极大的解决这个问题,倍增思想,那么显然需要最多的数就是2^n-1, 问题变转换成求大于x且2^n-1需要最多的那个n即可
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long LL;
int main()
{
LL n;
scanf("%lld",&n);
LL l=1,r=32;
LL ans;
while(l<=r)
{
LL mid=(l+r)/2;
if(pow(2,mid)-1>=n)
{
ans=mid;
r=mid-1;
}
else l=mid+1;
}
cout<<ans<<endl;
}