两题类似,所以放在一起了。
839 题目大意: 判断天平是否平衡。 思路:按前序遍历的顺序建树,在建树的同时可以判断是否平衡。
代码:
#include <algorithm> #include <cstdio> #include <cstring> #include <iostream> #include <queue> #include <set> using namespace std; int flag = 1; int pre() { int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); int lw = a,rw = c; if(a == 0) lw = pre(); if(c == 0) rw = pre(); if(lw * b != rw * d) flag = 0; return lw+rw; } int t; int main() { scanf("%d",&t); int num = 0; while(t--) { flag = 1; pre(); if(num != 0) printf("\n"); num++; if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }Uva699 题目大意: 下落的树叶,根结点到左右两遍的距离都是1,计算地上的不同的堆的落叶数量。
思路:和上一题类似,这题也是前序遍历建树,而且由于距离都是1,所以在建树的时候所属的位置就已经定了。
代码:
#include <cstdio> #include <iostream> #include <cstring> #include <queue> using namespace std; #define maxn 1005 int ans[maxn]; int build(int dis) { int a; scanf("%d",&a); //cout<<dis<<endl; if(a == -1) return -1; ans[dis] += a; build(dis-1); build(dis+1); } int main() { int num = 1; // freopen("d://in.txt","r",stdin); for(;;) { int a; memset(ans,0,sizeof(ans)); scanf("%d",&a); if(a == -1) break; build(500-1); build(500+1); ans[500] += a ; printf("Case %d:\n",num++); int mark = 0; for(int i = 0; i < maxn; i++) if(ans[i] != 0) { if(mark == 0 ){printf("%d",ans[i]);mark= 1;} else printf(" %d",ans[i]); } printf("\n\n"); } return 0; }