uva839 天平题解

题干

杠杆悬挂在绳子上,两边各挂有一个物体。它也可以被看作是一种天平。由杠杆原理,我们可知,一个杠杆的平衡条件是WL×DL = WR×DR。(其中WL为左边物体的重量,DL为左力臂的长度,WR为右边物体的重量,DR为右力臂的长度)一个更加复杂的天平也可通过此方式计算子天平来得到。如图二所示,在这种情况下,计算天平是否平衡是很复杂的,因此我们需要你编写一个程序,给出一个天平的描述作为输入,计算天平是否处于平衡状态。

输入 输入第一行为一个正整数n,代表接下来有n组询问,每一个参照下方叙述。该行后面是空行,在两个连续输入之间也有空行。 输入由若干行组成,每行包含4个由单个空格隔开的整数。这4个整数表示的分别是WL、DL、WR、DR; WL DL WR DR中如果WL或WR是零,则WL或WR下方仍有子天平。在这种情况下,我们计算子天平的重量作为物体的重量(WL或WR),杠杆和线的重量忽略。如果WL和WR都为零,则先给出左子天平再给出右子天平

输出 对于每个询问,两个连续的询问要用一个空行隔开。 如果天平处于平衡状态,输出“YES”,否则输出“NO”。

输入输出

样例输入

1

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

样例输出

YES

思路

本题看测试数据应该是要每个天平都平衡才可以,所以我们维护一个全局变量记录是否存在天平不平衡
观察易得数据像二叉树形式,所以我们遇到零就递归,递归到最底层就返回砝码之和。若是有一个天平不平衡就令全局变量为零即可

注意

uva的输入输出很阴间,这里需要注意读取不同组数据之间的空行,以及输出的时候输出空行,还有最后一行不能多输出一行空行!

代码

#include<iostream>
#include<sstream>
using namespace std;
bool if_mobile=1;
int cal_balance();
int main(){
    int n;
    cin>>n;
    getchar();
    while(n--){
        string white;
        getline(cin,white);
        if_mobile=1;
        cal_balance();
        if(if_mobile)cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
        if(n)cout<<endl;
    }
    return 0;
}
int cal_balance(){
    string a;
    getline(cin,a);
    istringstream iss(a);
    int w1,d1,w2,d2;
    iss>>w1>>d1>>w2>>d2;
    if(w1==0)w1+=cal_balance();
    if(w2==0)w2+=cal_balance();
    if(w1*d1!=w2*d2||d1==0||d2==0)if_mobile=0;
    return w1+w2;
}
posted @ 2025-08-18 21:36  hardestnut  阅读(9)  评论(0)    收藏  举报