讨论 / 挺水的(dfs函数并不是dfs,想不出函数名)
lijie201602 2017-09-09 23:42:26
点我顶贴 收藏 删除
#include<cstdio>

int n;

void dfs(int a,int b)

{

if(a==1) printf("%d\n",b+1);

else dfs(a/2,b+1);

printf("%d ",a-a/2);

}

int main()

{

scanf("%d",&n);

dfs(n,0);

return 0;

}

#1 lijie201602@2017-09-09 23:52:12
回复 删除
一个类似二分的方法
#2 zhuyebin@2017-09-13 22:45:30
回复 删除
#include<cstdio>

int a[110];

void dfs(int x,int y)

{

int l=x,r=y,m=a[(l+r)/2];

while(x<=y)

{

while(a[x]<m)x++;

while(a[y]>m)y--;

if(x<=y)

{

int t=a[x];a[x]=a[y];a[y]=t;

x++;y--;

}

}

if(x<r)dfs(x,r);

if(y>l)dfs(l,y);

}

int main()

{

int n;scanf("%d",&n);

int l=1,c=0,t=n;

while(t)

{

if(t-l>0){a[++c]=l;t-=l;l*=2;}

else if(t!=0)

{

if(t==1){a[c]++;t=0;}

else if(t%2==1){a[++c]=t;t=0;}

else if(t>a[c]){a[++c]=t;t=0;}

else {a[c]++;a[++c]=t-1;t=0;}

}

}

dfs(1,c);

printf("%d\n",c);

for(int i=1;i<=c;i++)

{

printf("%d ",a[i]);

}

}

查看更多回复
提交回复