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;
}

浙公网安备 33010602011771号