UVA839——天平
2015-04-22 10:42
316 查看
描述:
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.
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.
分析:
简而言之,输入一个天平系统,从上到下输入,如果该位置有子天平,则按照由左到右的顺序输入,判断该系统是否平衡(即左重量*左力臂=右重量*右力臂)
该题输入采用了递归定义的方式,因此题解用递归写也很方便,此处使用传值引用,代码可以写的很简洁。
P.S该题提交的时候遇到了点小问题,到现在没搞明白,疑点已经写在注释里了,求高人赐教。
代码:
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.
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.
分析:
简而言之,输入一个天平系统,从上到下输入,如果该位置有子天平,则按照由左到右的顺序输入,判断该系统是否平衡(即左重量*左力臂=右重量*右力臂)
该题输入采用了递归定义的方式,因此题解用递归写也很方便,此处使用传值引用,代码可以写的很简洁。
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; }
相关文章推荐
- UVa 839-Not so Mobile(天平)
- Uva 839 天平问题(模板题)
- uva 839 (Not so mobile)天平 ---递归输入
- 839UVa简单题天平
- 入门经典-6.3.3二叉树递归遍历-uva839天平-先序遍历,引用传值
- UVa 839 天平
- Uva839 Not so Mobile(天平)
- 紫书章六例题九 天平 UVA 839(更新二叉树的节点上的值)
- 紫书章六例题九 天平 UVA 839(更新二叉树的节点上的值)
- 天平 (Not so Mobile, UVa 839)
- UVa 839 天平
- 紫书章六例题九 天平 UVA 839(更新二叉树的节点上的值)
- 紫书章六例题九 天平 UVA 839(更新二叉树的节点上的值)
- 6_9 天平(UVa839)<二叉树的DFS>
- UVa 839 天平
- 天平(UVa 839)
- 例题6-9 天平 UVa 839 递归
- 紫书章六例题九 天平 UVA 839(更新二叉树的节点上的值)
- uva-839天平
- UVA 839 天平