UVa 839 天平 (Not so Mobile)

博客探讨了如何处理树状天平的平衡问题,依据力矩相等原则,即W1D1 = W2D2。通过递归方式输入天平数据,当W1或W2为0时,表示存在子天平。递归算法首先检查子天平的平衡状态,然后判断当前天平是否平衡。最后,返回天平是否平衡的结果。
摘要由CSDN通过智能技术生成

输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等就是 W1D1 = W2D2 ,其中 W1 和 W2 分别表示天平左右两边的砝码重量,D为距离。
采用递归方式输入,每个天平的格式为 W1, D1, W2, D2 当 W1 || W2 == 0时,表示砝码实际上是一个子天平,接下来会描述这个子天平,当 W1 = W2 = 0时,会先描述左子天平,然后再描述又子天平。

要点:

  • 树状天平,且采用递归方式输入,因此采用递归方法解题
  • 需要的东西是天平左边的质量以及左边如果是天平是否平衡,右边同理,最后判断该天平是否平衡,作为返回true的条件。
#include<bits/stdc++.h>
using namespace std;

bool solve(int& m) {
    int W1, D1, W2, D2;
    cin >> W1 >> D1 >> W2 >> D2;
    bool left = true, right = true;
    if(!W1) left = solve(W1);       //看看左边是否平衡以及获得左边的质量
    if(!W2) right = solve(W2);      //看看右边是否平衡以及获得右边的质量
    m = W1 + W2;
    return left && right && (W1 * D1 == W2 * D2);   //如果任一边不平衡或者这个天平本身不平衡,就是假
}

int main() {
    //freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
    int T, m;
    cin >> T;
    while(T--) {
        if(solve(m)) cout << "YES" << endl;
        else cout << "NO" << endl;
        if(T)
        cout << endl;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值