首页 > 代码库 > uva 839 - Not so Mobile

uva 839 - Not so Mobile

  Not so Mobile 

Before being an ubiquous communications gadget, a mobile was just a structure made of strings and wires suspending colourfull things. This kind of mobile is usually found hanging over cradles of small babies.

 

\epsfbox{p839a.eps}

The figure illustrates a simple mobile. It is just a wire, suspended by a string, with an object on each side. It can also be seen as a kind of lever with the fulcrum on the point where the string ties the wire. From the lever principle we know that to balance a simple mobile the product of the weight of the objects by their distance to the fulcrum must be equal. That is Wl×Dl = Wr×Dr where Dl is the left distance, Dr is the right distance, Wl is the left weight and Wr is the right weight.

 


In a more complex mobile the object may be replaced by asub-mobile, as shown in the next figure. In this case it is not sostraightforward to check if the mobile is balanced so we need youto write a program that, given a description of a mobile as input,checks whether the mobile is in equilibrium or not.

 

\epsfbox{p839b.eps}

 

Input 

The input begins with a single positive integer on a line by itself indicatingthe number of the cases following, each of them as described below.This line is followed by a blank line, and there is also a blank line betweentwo consecutive inputs.

 


The input is composed of several lines, each containing 4 integersseparated by a single space. The 4 integers represent thedistances of each object to the fulcrum and their weights, in theformat: Wl Dl Wr Dr

If Wl or Wr is zero then there is a sub-mobile hanging fromthat end and the following lines define the the sub-mobile. Inthis case we compute the weight of the sub-mobile as the sum ofweights of all its objects, disregarding the weight of the wiresand strings. If both Wl and Wr are zero then the followinglines define two sub-mobiles: first the left then the right one.

 

Output 

For each test case, the output must follow the description below.The outputs of two consecutive cases will be separated by a blank line.

 


Write `YES‘ if the mobile is in equilibrium, write `NO‘ otherwise.

 

Sample Input 

10 2 0 40 3 0 11 1 1 12 4 4 21 6 3 2

 

Sample Output 

YES
#include <iostream>#include <stack>#include <cstring>#include <cstdio>#include <string>#include <algorithm>#include <queue>#include <set>#include <map>#include <fstream>#include <stack>#include <list>#include <sstream>#include <cmath>using namespace std;#define ms(arr, val) memset(arr, val, sizeof(arr))#define mc(dest, src) memcpy(dest, src, sizeof(src))#define N 200#define INF 0x3fffffff#define vint vector<int>#define setint set<int>#define mint map<int, int>#define lint list<int>#define sch stack<char>#define qch queue<char>#define sint stack<int>#define qint queue<int>bool ans;int n;int build(){    int wl, dl, wr, dr;    scanf("%d%d%d%d", &wl, &dl, &wr, &dr);    if(!wl)         wl = build();//zuo    if (!wr)        wr = build();//you    if (wl * dl != wr * dr)        ans = false;    return wl + wr;}void input(){    if (ans)    {        puts("YES");    }    else    {        puts("NO");    }    if (n)    {        putchar(\n);    }}int main(){    scanf("%d", &n);    while (n--)    {        ans = true;        build();        input();    }    return 0;}