题目链接
题目大意:
输入一个树状天平,根据力矩相等原则(力臂乘质量)判断是否平衡。所谓力矩相等,就是w1d1=w2d2。按照递归(先序)方式输入,每个天平的格式为w1,d1,w2,d2,若输入的W(质量)为0,则说明该“砝码”是个子天平,接下来会描述该子天平。
Sample Input
1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2
Sample Output
YES
解题思路:
输入采用了递归的方式,我们也很自然想到递归处理。父天平两边的重量是子天平砝码的质量总和,因此我们可以采用引用传值来修改左右子天平的重量。
AC代码:
#include<iostream>
#include<stdio.h>
using namespace std;
bool solve(int &w) {//引用传值
int w1, d1, w2, d2;
bool b1 = true, b2 = true;//用于判断左右子树是否平衡
cin >> w1 >> d1 >> w2 >> d2;
if (!w1)b1 = solve(w1);//采用引用传值来修改左右子天平的重量
if (!w2)b2 = solve(w2);
w = w1 + w2;//此处用于修改子树的重量
return b1&&b2 && (w1*d1 == w2*d2);
}
int main() {
int t, tmp = 0;
cin >> t;
while (t--) {
if (solve(tmp))cout << "YES\n";//首次调用solve函数传入的参数没有实际意义
else cout << "NO\n";
if (t)cout << "\n";//此处是因为输入格式的要求
}
//system("pause");
return 0;
}

本文介绍了一种使用递归算法解决树状天平平衡问题的方法。通过输入天平的结构,利用力矩相等原则判断整个天平系统是否平衡。代码采用C++实现,详细解释了解题思路和AC代码。

607

被折叠的 条评论
为什么被折叠?



