839 - Not so Mobile

Not so Mobile

PS:因为该题排版较麻烦,这里给出OJ网址:UVa839 - Not so Mobile

输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等,就是WlDl=WrDr,其中Wl和Wr分别为左右两边砝码的重量,D为距离。采用递归(先序)方式输入:每个天平的格式为Wl,Dl,Wr,Dr,当Wl或Wr为0时,表示该“砝码”实际是一个子天平,接下来会描述这个子天平。当Wl=Wr=0时,会先描述左子天平,然后是右子天平。

样例输入:

1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2

其正确输出为YES,对应图6-6。

839 - Not so Mobile_第1张图片

#include <iostream>

using namespace std;

// 输入一个子天平,返回子天平是否平衡,参数W修改为子天平的总重量
bool solve(int &W) {
    int W1, D1, W2, D2;
    bool b1 = true;
    bool 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, W;
    cin >> T;
    while(T--) {
        if(solve(W)) {
            cout << "YES" << endl;
        } else {
            cout << "NO" << endl;
        }
        if(T) {
            cout << endl;
        }
    }
}

你可能感兴趣的:(ACM,uva,uva839)