UVa 699 The Falling Leaves(递归建树)
假设一棵二叉树也会落叶 而且叶子只会垂直下落 每个节点保存的值为那个节点上的叶子数 求所有叶子全部下落后 地面从左到右每堆有多少片叶子
和UVa 839 -- Not so Mobile(树的递归输入)有点像 都是递归输入的 一个节点(设水平位置为p) 则它的左右儿子节点的水平位置分别为 p-1 p+1 也是可以边输入边处理的 输入完也就得到答案了 注意每个样例后面都有一个空行 包括最后一个
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 const int maxn = 205; 5 int sum[maxn]; 6 void build(int p) 7 { 8 int v; 9 cin>>v; 10 if(v == -1) return; 11 sum[p] += v; 12 build(p-1);build(p+1); 13 } 14 15 bool init() 16 { 17 int v; 18 cin>>v; 19 if(v == -1) return false; 20 memset(sum,0,sizeof(sum)); 21 sum[maxn/2] += v; 22 build(maxn/2-1);build(maxn/2+1); 23 return true; 24 } 25 26 int main() 27 { 28 int kase = 0; 29 while(init()) 30 { 31 int p=0; 32 while(sum[p] == 0) p++; 33 cout<<"Case "<<++kase<<":"<<endl; 34 for(int i=p;;i++) 35 { 36 if(sum[i] == 0) 37 { 38 cout<<endl<<endl;break; 39 } 40 if(i!=p) cout<<" "; 41 cout<<sum[i]; 42 } 43 } 44 return 0; 45 }