hdu5573Binary Tree(dfs)(上海现场赛B题)

这道题当时的idea是我想出来的,ACalvin学长听完我的思路后直接上,1A,印象深刻!

题意就是说从一个深度为k的完全二叉树,找一条根到叶子节点的路径,使得它们的编号能够通过加减法得到N。

我的做法是枚举叶子节点往上dfs,发现如果当前的值小于N,就必须加上当前的编号才有可能达到N,同理,如果当前的值大于N,就必须减去当前的编号才有可能达到N。

当时感觉枚举几个就会很快得到答案,心里还是有点虚的,1A的时候真是兴奋啊。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long a[100],b[100];
int n,k;
bool dfs(long long sum,long long now,int d)
{
	if (d==0)
	{
		if (now==0&&sum==n) return 1;
		else return 0;
	}
	if (sum<n) a[d]=now,b[d]=1,dfs(sum+now,now/2,d-1);
	else a[d]=now,b[d]=0,dfs(sum-now,now/2,d-1);
}
int main()
{
	int t;
	scanf("%d",&t);
	for (int cas=1;cas<=t;cas++)
	{
		scanf("%d%d",&n,&k);
		for (long long i=1<<(k-1);;i++)
			if (dfs(0,i,k)) break;
		printf("Case #%d:\n",cas);
		for (int i=1;i<=k;i++)
			printf("%d ",a[i]),printf(b[i]?"+\n":"-\n");

	}
}