正文
第四题:[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]); }