链接
http://www.lydsy.com/JudgeOnline/problem.php?id=1192
题解
这个不是傻逼题吗
显然直接二进制拆。现在要处理重复的问题。 比如5,直接拆出来是1+2+2,因为有两个2,所以不合法。但是正确的答案肯定是5=1+1+3,这样1、2、3、4、5都能够组合出来。 具体的,如果两个二进制数
10000
和
10000
,我把它们变成
1111
和
10001
,如果原来的方案里要用
10000+10000
,那现在可以直接用拆出来的两个新的替代。 如果原来只用其中一个,那么现在可以用
1111+1
。如果原来就要用
10000+1
,那现在就可以用
10001
。 这题也不是特别傻逼,竟然难住了明神。
代码
#include <cstdio>
#include <algorithm>
#define ll long long
using namespace std;
int main()
{
ll m, x, cnt=
0;
scanf(
"%lld",&m);
for(x=
1;x<=m;x=x<<
1)cnt++,m-=x;
if(m)cnt++;
printf(
"%lld",cnt);
return 0;
}
转载请注明原文地址: https://ju.6miu.com/read-36312.html