#19241. 零重力拔河
零重力拔河
你好,我是阿西莫夫。
力的合成(Vector Addition)是物理学中一个反直觉但极其迷人的概念。它告诉我们,两个大力士如果不往同一个方向使劲,他们的合力可能还不如一个小孩。
对于计算机来说,处理“方向”的最好方式不是画箭头,而是正交分解(Orthogonal Decomposition)。无论力指向哪里,我们都可以把它拆解成水平(x轴)和垂直(y轴)两个分量。
这就把几何问题变成了代数问题:
$$|\vec{F}_{net}| = \sqrt{(\sum F_x)^2 + (\sum F_y)^2} $$为了考察学生对矢量叠加以及勾股定理在编程中的应用,同时警惕数据溢出,我为你构思了这道题目。
[OI 题库] 零重力拔河 (Zero-G Tug-of-War)
题目背景
“力是矢量。这意味着,如果你和你的敌人背对背开枪,子弹的动量是守恒的,但你们的友谊就归零了。” —— 《太空游侠手册》
在一年一度的“星际奥林匹克”中,最受欢迎的项目是“零重力多向拔河”。
比赛规则如下:一个巨大的、光滑的金属球悬浮在赛场中央。 个不同种族的大力士(或推进器)同时通过缆绳拉扯这个金属球。 每个大力士的拉力都是恒定的,但方向各不相同。为了方便记录,裁判组将每个人的拉力都分解为了X轴分量和Y轴分量。
作为裁判长,你需要计算出:在这个瞬间,金属球受到的合力(Net Force) 的大小是多少?
题目描述
输入 个力的信息,每个力由两个整数 和 描述。
- :第 个力在水平方向的分量(正数为向右,负数为向左)。
- :第 个力在垂直方向的分量(正数为向上,负数为向下)。
请计算合力 的大小(即合力向量的模长)。
公式提示:
- 合力的 X 分量
- 合力的 Y 分量
- 合力的大小 $|\vec{F}_{total}| = \sqrt{X_{total}^2 + Y_{total}^2}$
输入格式
第一行一个整数 ,表示力的个数。 接下来 行,每行两个整数 ,表示一个力的两个分量。
输出格式
一个浮点数,表示合力的大小,保留 2 位小数。
样例数据
样例 1 (相互抵消)
2
10 0
-10 0
0.00
(解析:一个向右拉10,一个向左拉10。合力为0。)
样例 2 (勾股定理)
2
3 0
0 4
5.00
(解析:X轴合力3,Y轴合力4。根据勾股定理 )
样例 3 (多力合成)
3
10 10
-5 -5
-5 -5
0.00
(解析:X轴合力 ,Y轴同理。)
数据范围
- 注意:虽然单个力不大,但 很大,累加后的平方运算可能会超过
int(21亿) 的范围。