题意:开始时有n堆糖,每堆开始时有1个把这些糖果聚在一堆。但她每次只能把两堆糖果合并成一堆。
已知把两堆数量为a和b的糖果聚在一堆的代价是|a-b|。
kotori想知道,她把这n块糖果聚在一堆的最小代价是多少?
题目链接
one:
for(int i=1;i<=1e18+10;i++)
{
m[i] = m[i/2]+m[i-i/2] +i%2;
}
problem:复杂度过高,达到了1e18
two:
可以想到,可以使用递归来优化
(坑点1:n=0)
ll init(ll n)
{
if(n==1||n==0) return 0;
if(n&1) return m[n] = init(n/2) + init(n/2+1)+1;
else return m[n] = init(n/2)*2;
}
void main():
{
init(1e18); //初始化
}
//坑点1:n=0
problem:从1到1e18不能都初始化,而且有很多重复的
three:
ll init(l