当前位置: 首页 > news >正文

[树] 最轻的天平

问题描述

天平的两边有时不一定只能挂物品,还可以继续挂着另一个天平,现在给你一些天平的情况和他们之间的连接关系,要求使得所有天平都能平衡所需物品的总重量最轻。

一个天平平衡当且仅当“左端点的重量 × \times × 左端点到支点的距离 = = = 右端点的重量 × \times × 右端点到支点的距离。

在这里插入图片描述

输入格式

第一行包含一个 N ( N ≤ 100 ) N(N \le 100) N(N100),表示天平的数量,天平编号为 1 1 1 N N N

接下来包含 N N N 行描述天平的情况,每行 4 4 4 个整数 P , Q , R , B P,Q,R,B P,Q,R,B P P P Q Q Q 表示横杆上支点到左边的长度与到右边的距离的比例为 P : Q P:Q P:Q R R R 表示左边悬挂的情况,如果 R = 0 R = 0 R=0 说明悬挂的物品,否则表示左边悬挂的是天平 R R R B B B 表示右边的悬挂情况,如果 B = 0 B = 0 B=0 表示右边悬挂的是物品,否则右边悬挂着天平 B B B

对于所有的输入,保证 W × L ≤ 2 31 W \times L \le 2^{31} W×L231,其中 W W W 为最轻的物品重量,而 L L L 为输入中描述左右比例时出现的最大值。

输出格式

输出一个整数表示使得所有天平都平衡所需最轻的物品总重量。

样例

样例输入1:

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

样例输出1:

40

数据范围

对于所有数据, N ≤ 100 , W × L < 2 31 N \le 100,W \times L < 2^{31} N100,W×L<231

题解

考虑第 i i i 个天平,假设左右最轻重量为 W 1 , W 2 W1, W2 W1,W2,比例为 L 1 : L 2 L1:L2 L1:L2,当前需要左右放 X X X Y Y Y
X X X Y Y Y 需要满足: W 1 × L 1 × X = W 2 × L 2 × Y W1 \times L1 \times X = W2 \times L2 \times Y W1×L1×X=W2×L2×Y
移项可得: X Y = W 2 × L 2 W 1 × L 1 \frac{X}{Y} = \frac{W2 \times L2}{W1 \times L1} YX=W1×L1W2×L2
因此,天平重量最小,必须将 x y \frac{x}{y} yx 化为最简分数。
求出 W 2 × L 2 W2 \times L2 W2×L2 W 1 × L 1 W1 \times L1 W1×L1 的最大公因数 P P P X = W 2 × L 2 × P X = W2 \times L2 \times P X=W2×L2×P Y = W 1 × L 1 × P Y = W1 \times L1 \times P Y=W1×L1×P
重量为 X × W 1 + Y × W 2 X \times W1 + Y \times W2 X×W1+Y×W2
处理时直接递归求解

#define int long long
int dfs(int x){if(x == 0){//边界return 1;}int t1 = dfs(l[x]), t2 = dfs(r[x]);int t = __gcd(a[x] * t1, b[x] * t2);return t1 * a[x] * t2 / t + t2 * b[x] * t1 / t;
}
signed main(){scanf("%d", &n);for(int i = 1; i <= n; ++ i){scanf("%d %d %d %d", &a[i], &b[i], &l[i], &r[i]);f[l[i]] = 1;f[r[i]] = 1;}int rt = 0;for(int i = 1; i <= n; ++ i){if(!f[i]){rt = i;break;}}printf("%lld", dfs(rt));return 0;
}
http://www.lryc.cn/news/506257.html

相关文章:

  • Linux udev介绍使用
  • 单片机:实现节日彩灯(附带源码)
  • 流程引擎Activiti性能优化方案
  • 【爬虫一】python爬虫基础合集一
  • any/all 子查询优化规则的原理与解析 | OceanBase查询优化
  • ECharts 饼图:数据可视化的重要工具
  • 第10章:CSS最佳实践 --[CSS零基础入门]
  • 怎么在idea中创建springboot项目
  • 递归读取指定目录下的文件
  • 【模型压缩】原理及实例
  • 常用的JVM启动参数有哪些?
  • Curvelet 变换与FDCT
  • Django Admin 管理工具
  • Android笔记【19】
  • 矩阵在资产收益(Asset Returns)中的应用:以资产回报矩阵为例(中英双语)
  • Docker 中如何限制CPU和内存的使用 ?
  • 【AIGC-ChatGPT进阶提示词-《动图生成》】怪物工厂:融合想象力与创造力的奇幻世界
  • docker 使用 xz save 镜像
  • C#经典算法面试题
  • vulnhub靶场【DriftingBlues】之9 final
  • 有124个叶子节点的,完全二叉树最多有多少个节点
  • 从RNN到Transformer:生成式AI自回归模型的全面剖析
  • Java爬虫大冒险:如何征服1688商品搜索之巅
  • 基于Spring Boot的无可购物网站系统
  • 智能人家谱程序创意
  • Redis 7.x哨兵模式如何实现?基于Spring Boot 3.x版
  • 解决QTCreator在Debug时无法显示std::string类型的问题
  • leetcode 面试经典 150 题:无重复字符的最长子串
  • 0101多级nginx代理websocket配置-nginx-web服务器
  • 【前端】Jquery拍照,通过PHP将base64编码数据转换成PNG格式,并保存图像到本地