这道题当时的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"); } }