[HNOI2006]鬼谷子的钱袋,洛谷之提高历练地,神奇的解法

正文

      第四题:[HNOI2006]鬼谷子的钱袋

      由这题我们可以想到二分的性质,一个数一定可以被2的幂次方相加而得。

      那么很容易就可以知道,当一个数是偶数的时候,把它分为两部分相等的数来进行递归。

      当一个数是奇数时,我们就要把除以2之后较小的数往下传递。

      这样才可以使得分解的数较小。

      然后因为分解出来的数是从大到小的,所以在归的时候把它加进队列来使得所得的数比较小。

#include
#include
#include

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]);
}

你可能感兴趣的:([HNOI2006]鬼谷子的钱袋,洛谷之提高历练地,神奇的解法)