6 9_not_so_mobile_uva839 - nuaazdh/acm GitHub Wiki
##例题6-9 天平(Not so mobile UVa839)
###问题
天平平衡满足 Wl*Dl = Wr*Dr
。现在以一个二叉树的形式给定一个天平,每一行给定四个数,分别为Wl
、Dl
、Wr
和Dr
,如果W为零,表示存在子树。
第一行给定测试case 的数目,后面跟着一个空行,然后每个测试case 以空行分开。 每行四个数值。若存在子树,则左子树在先。
样例输入
1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2
样例输出
YES
###分析
一个天平平衡,首先每个子树平衡,然后子树的总和作为根节点的W值,最后保证根节点的左右子树平衡即可。
如何根据输入建立起一棵树,采用递归的形式,读入一行,若存在W
值为零,下一行就是左子树,对左子树中存在为零的W
也是这样处理。若没有子树,先判断是否平衡,然后返回总的W
。
#include <stdio.h>
int is_balance = 1;
int balance() {
int wl, dl, wr, dr;
scanf("%d%d%d%d",&wl,&dl,&wr,&dr);
if (wl == 0) {
wl = balance();
}
if (wr == 0) {
wr = balance();
}
if (wl * dl != wr * dr) {
is_balance = 0;
}
return wl + wr;
}
int main() {
int T;
scanf("%d",&T);
while (T--) {
is_balance = 1;
balance();
if (is_balance) {
printf("YES\n");
} else {
printf("NO\n");
}
if(T) printf("\n");
}
return 0;
}
###点评
- 设置一个全局变量来记录是否平衡,注意每次都要清楚这个变量;
- 注意当子树不平衡时,仅仅是设置下全局变量,仍要把全部输入读完,不能中途break或返回;