题解[UVA839]天平 Not so Mobile

Description

Input

Output

Examples

Input

1
0 2 0 4
0 3 0 1
1 1 1 1
2 4 4 2
1 6 3 2

Output

YES

Translation

输入一个树状天平,根据力矩相等原则判断是否平衡。

采用递归(先序)方式输入:每个天平格式为\(W_l,D_l,W_r,D_r\),当\(W_l\)或\(W_r\)为\(0\)时,表示该“砝码”实际是一个子天平,接下来会描述这个子天平。当\(W_l=W_r=0\)时,会先描述左子天平,然后是右子天平。

其正确输出为\(YES\),否则输出\(NO\)。

Solution

这道题目的输入就采取了递归方式定义,所以编写一个递归函数进行输入比较自然。实际上,在输入的过程中就可以完成判断。由于使用了引用传值,因此,代码很精简。

本题极为重要,是递归的好题。

Code

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>

using namespace std;

inline int gi()
{
    int f = 1, x = 0; char c = getchar();
    while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
    while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
    return f * x;
}

int t, y;//t为询问总数,y为子天平的总重量

bool pd(int &x)//输入一个子天平,返回子天平是否平衡,参数x为当前子天平的总重量
{
    int a, b, c, d;//输入顺序同题目翻译
    bool f = true, fl = true;//判断有没有子天平
    a = gi(), b = gi(), c = gi(), d = gi();//输入
    if (!a) f = pd(a);//左边有子天平
    if (!c) fl = pd(c);//右边有子天平
    x = a + c;//修改总重量
    return (f && fl && (a * b == c * d));//进行判断
}

int main()//进入主函数
{
    t = gi();//输入数据组数
    while (t--)
    {
        if (pd(y)) puts("YES");//如果合法就输出YES
        else puts("NO");//否则输出NO
        if (t) puts("");//每组数据用空行隔开,最后一组数据后不要输出空行
    }
    return 0;//结束主函数
}

原文地址:https://www.cnblogs.com/xsl19/p/11104958.html

时间: 2024-08-30 18:13:17

题解[UVA839]天平 Not so Mobile的相关文章

UVA839 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 fig

UVA839 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. ????The figure illustrates a simple mobil

UVA - 12166 Equilibrium Mobile (修改天平)(dfs字符串表示的二叉树)

题意:问使天平平衡需要改动的最少的叶子结点重量的个数. 分析:天平达到平衡总会有个重量,这个重量可以由某个叶子结点的重量和深度直接决定. 如下例子: 假设根结点深度为0,结点6深度为1,若以该结点为基准(该结点值不变),天平要平衡,总重量是12(6 << 1),而若以结点3为基准,天平要平衡,总重量也是12(3 << 2). 由此可得,只需要算出以每个结点为基准的总重量,若该重量下对应的叶子结点最多,则使天平在此重量下平衡改变的叶子结点数最少. #pragma comment(li

二叉树的递归遍历 天平UVa839

题意:输入一个树状的天平,利用杠杆原理,根据力矩是否相等(W1D1==W1D2)判断天平是否平衡 解题思路:1.由于判断天平是否平衡,当W1和W2都为0的时候,会先输入左子树,再输入右子树 2.此时的W1和W2会变成子树的重量之和,此时最好用到引用(同时改变传入参数的值) 3.递归的输入,并且判断子天平是否平衡 代码如下: 1 #include<stdio.h> 2 #include<iostream> 3 using namespace std; 4 bool input(int

UVa 1354 Mobile Computing | GOJ 1320 不加修饰的天平问题

传送门1(UVa): https://uva.onlinejudge.org/external/13/1354.pdf 传送门2(GOJ): http://acm.gdufe.edu.cn/Problem/read/id/1320 题意: 长度限制 r (1 < r < 10), 给 n (1 <= n <= 6) 个砝码,组成平衡(考虑重量和力臂)的天平,求天平最长能多长. 2015个人选拔赛#6 1004 比赛的时候完全不知道怎么做,比赛完两天重新看一遍有点思路就是敲不出来(弱

UVA 1354 Mobile Computing(天平难题,枚举子集,递归,好题*)

1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 5 /** 6 思路:在每一个根节点枚举左右子树 7 8 学习: 9 (1)枚举子集的方法 例如 枚举 s = 100101 的子集 10 for(int l = (s-1)&s , l > 0 ; l = (l-1) & s){ 11 int r = s ^ l; 12 (2)思考:如何表示 左边距离 右边距离 . 该点的

UVa839 Not so Mobile (二叉树的DFS)

链接:http://acm.hust.edu.cn/vjudge/problem/19486分析:二叉树模型的DFS.输入是采用递归方式输入,直接变读边判断就行. 1 #include <cstdio> 2 3 bool solve(int& W) { 4 int W1, D1, W2, D2; 5 scanf("%d%d%d%d", &W1, &D1, &W2, &D2); 6 bool b1 = true, b2 = true;

6_9 天平(UVa839)&lt;二叉树的DFS&gt;

前一个ubiquous通信小工具,移动只是一个由弦和电线组成的结构五彩缤纷的东西.这种移动通常被发现悬挂在小婴儿的摇篮.图说明了一个简单的移动.它只是一个电线,悬挂的一个字符串,每一个对象的对象.它可以也被看作是一种杠杆的支点上的字符串的字符串联系的电线.从杠杆原理,我们知道,要平衡一个简单的移动的对象的重量的产品他们距离支点必须相等.这是WL×DL = WR×DR,DL是左边的距离DR是右边的距离,WL是左边的重量和WR是右边的重量.在一个更复杂的移动的对象可能被替换由一个子移动,如下图所示.

天平 (Not so Mobile UVA - 839)

题目描述: 题目思路: 1.DFS建树 2.只有每个树的左右子树都平衡整颗树才平衡 1 #include <iostream> 2 using namespace std; 3 4 bool solve(int& w) 5 { 6 int d1,w1,d2,w2; 7 cin >> w1 >> d1 >> w2 >> d2 ; 8 bool b1 = true ,b2 = true ; 9 if(!w1) b1 = solve(w1) ;