网站换空间的流程/宣传网页制作
正文
第四题:[HNOI2006]鬼谷子的钱袋
由这题我们可以想到二分的性质,一个数一定可以被2的幂次方相加而得。
那么很容易就可以知道,当一个数是偶数的时候,把它分为两部分相等的数来进行递归。
当一个数是奇数时,我们就要把除以2之后较小的数往下传递。
这样才可以使得分解的数较小。
然后因为分解出来的数是从大到小的,所以在归的时候把它加进队列来使得所得的数比较小。
#include<cstdio>
#include<cstdlib>
#include<cstring>int n;
int op[10010];
int t=0;void dfs(int x){int p=(x+1)/2;if(x-p>1)dfs(x-p);else op[++t]=x-p;op[++t]=p;
}int main(){scanf("%d",&n);dfs(n);printf("%d\n",t);for(int i=1;i<=t;i++)printf("%d ",op[i]);
}