UVA839——天平

来源:互联网 发布:淘宝空间图片协议在哪 编辑:程序博客网 时间:2024/05/24 04:24

描述:

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 a sub-mobile, as shown in the next figure. In this case it is not so straightforward to check if the mobile is balanced so we need you to write a program that, given a description of a mobile as input, checks whether the mobile is in equilibrium or not.

\epsfbox{p839b.eps}
分析:
简而言之,输入一个天平系统,从上到下输入,如果该位置有子天平,则按照由左到右的顺序输入,判断该系统是否平衡(即左重量*左力臂=右重量*右力臂)
该题输入采用了递归定义的方式,因此题解用递归写也很方便,此处使用传值引用,代码可以写的很简洁。
P.S该题提交的时候遇到了点小问题,到现在没搞明白,疑点已经写在注释里了,求高人赐教。
代码:
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cmath>#include<string>#include<vector>#include<queue>#include<stack>#include<set>#include<map>//#define file#define PI 3.1415926#define MAX(A,B) ((A)>(B)?(A):(B))#define ll long long#define fordo(A,B,C) for(int (A)=(B);(A)<=(C);(A)++)using namespace std;bool solve(int& W){    int W1,D1,W2,D2;    bool b1=true;    bool b2=true;    cin>>W1>>D1>>W2>>D2;    if(!W1)//这里很奇怪,当我用W1==0时VJ就会报WA,只有!W1这种表示法可以过,貌似这两者没区别吧……        b1=solve(W1);//当存在子天平,求解。    if(!W2)        b2=solve(W2);    W=W1+W2;//由子天平重量计算该天平重量    return b1&&b2&&(W1*D1==W2*D2);    //递归求解:当该托盘的子天平都平衡,并且该天平平衡,则返回该天平平衡。}int main(){    #ifdef file    freopen("test.in", "r", stdin);    freopen("test.out", "w", stdout);    #endif // file    int T,W;    cin>>T;    while(T--)    {        if(solve(W))            cout<<"YES"<<endl;        else            cout<<"NO"<<endl;        if(T)            cout<<endl;    }    return 0;}


0 0
原创粉丝点击