题意:
最少将n拆分成多少个数,可以凑出1到n的所有数字。
做题前:
这题是不是假题啊?
我用1 2 3 4 5 …这样凑吧
好像不太对啊。
是dp吗
我想想
这状态怎么表示啊?
昨天刚听过Claris的二进制拆分背包,我试一下吧。
?竟然过了???
分析:
瞎猜一波原理吧。
用二进制拆分一定是可以表示出所有数字的,这个很好理解。
但是为什么二进制拆分是最好的呢?
为什么不是三进制拆分或者更高进制的拆分呢?
举个例子吧
三进制拆分
1 3 9 27…
这个根本凑不出1到n的所有数字,因为他们之间的差距实在是太大了。
更高进制的拆分就更不行了。
试着猜想,应该只有二进制拆分才可以保证左右的数字都可以被组合出来。
遂做完。
#include <bits/stdc++.h>
#define sc(n) scanf("%d",&n)
#define pt(n) printf("%d\n",n)
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define vi vector<int>
#define vl vector<long long>
#define pb push_back
using namespace std;
int main()
{
int m;
sc(m);
cout<<ceil(log2(m))<<endl;
return 0;
}
代码还没头文件长