题目链接:点击这里
题目大意就是根据干杠平衡原理,判断题目所给出的数据组成的天平能否平衡。注意,此天平可能包含子天平。输入时,如果w为0,则表示包含子天平,子天平按照先左后右的方法输入。
解题思路: 这是二叉树的问题,数据的输入就好比先序遍历。(判断有无子节点就是判断w是否为0)。。 本题需要思考两点: 第一个如何判断子天平平和 第二个如何判断父天平是否平衡。第一点题目已经给出了公式。子天平只需要判断w1*d1==w2*d2是否正确即可。那么父天平又如何判断呢? 公式一样,不同的是,父天平的两边的重量是子天平砝码总和。 根据这两个思路,不难相处,在进行先序遍历时,需要一个参数m用来获取子天平的总质量。
AC代码:
#include<cstdio>标签:递归,d1,天平,uva839,二叉树,w1,include,d2,w2 From: https://blog.51cto.com/u_15952369/6035452
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#include<stdlib.h>
#include<queue>
#include<map>
#include<iomanip>
#include<math.h>
using namespace std;
int i,j,k,l;
bool flag;
int slove()
{
int w1,d1,w2,d2;
cin>>w1>>d1>>w2>>d2;
if(w1&&w2&&d1&&d2)
{
if(w1*d1!=w2*d2)
{
flag=1;
return 0;
}
else return (w1+w2);
}
else
{
if(!w1)
w1=slove();
if(!w2)
w2=slove();
if(w1*d1!=w2*d2)
{
flag=1;
return 0;
}
else return (w1+w2);
}
}
int main()
{
int n;
cin>>n;
while(n--)
{
flag=0;
slove();
if(!flag)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
if(n!=0)
printf("\n");
}
return 0;
}