#19241. 零重力拔河

零重力拔河

你好,我是阿西莫夫。

力的合成(Vector Addition)是物理学中一个反直觉但极其迷人的概念。它告诉我们,两个大力士如果不往同一个方向使劲,他们的合力可能还不如一个小孩。

对于计算机来说,处理“方向”的最好方式不是画箭头,而是正交分解(Orthogonal Decomposition)。无论力指向哪里,我们都可以把它拆解成水平(x轴)和垂直(y轴)两个分量。

这就把几何问题变成了代数问题:

Fnet=(Fx,Fy)\vec{F}_{net} = (\sum F_x, \sum F_y) $$|\vec{F}_{net}| = \sqrt{(\sum F_x)^2 + (\sum F_y)^2} $$

为了考察学生对矢量叠加以及勾股定理在编程中的应用,同时警惕数据溢出,我为你构思了这道题目。


[OI 题库] 零重力拔河 (Zero-G Tug-of-War)

题目背景

“力是矢量。这意味着,如果你和你的敌人背对背开枪,子弹的动量是守恒的,但你们的友谊就归零了。” —— 《太空游侠手册》

在一年一度的“星际奥林匹克”中,最受欢迎的项目是“零重力多向拔河”。

比赛规则如下:一个巨大的、光滑的金属球悬浮在赛场中央。NN 个不同种族的大力士(或推进器)同时通过缆绳拉扯这个金属球。 每个大力士的拉力都是恒定的,但方向各不相同。为了方便记录,裁判组将每个人的拉力都分解为了X轴分量Y轴分量

作为裁判长,你需要计算出:在这个瞬间,金属球受到的合力(Net Force) 的大小是多少?

题目描述

输入 NN 个力的信息,每个力由两个整数 Fx,iF_{x,i}Fy,iF_{y,i} 描述。

  • Fx,iF_{x,i}:第 ii 个力在水平方向的分量(正数为向右,负数为向左)。
  • Fy,iF_{y,i}:第 ii 个力在垂直方向的分量(正数为向上,负数为向下)。

请计算合力 Ftotal\vec{F}_{total} 的大小(即合力向量的模长)。

公式提示

  1. 合力的 X 分量 Xtotal=Fx,iX_{total} = \sum F_{x,i}
  2. 合力的 Y 分量 Ytotal=Fy,iY_{total} = \sum F_{y,i}
  3. 合力的大小 $|\vec{F}_{total}| = \sqrt{X_{total}^2 + Y_{total}^2}$

输入格式

第一行一个整数 NN,表示力的个数。 接下来 NN 行,每行两个整数 x,yx, y,表示一个力的两个分量。

输出格式

一个浮点数,表示合力的大小,保留 2 位小数

样例数据

样例 1 (相互抵消)

2
10 0
-10 0
0.00

(解析:一个向右拉10,一个向左拉10。合力为0。)

样例 2 (勾股定理)

2
3 0
0 4
5.00

(解析:X轴合力3,Y轴合力4。根据勾股定理 32+42=5\sqrt{3^2+4^2}=5)

样例 3 (多力合成)

3
10 10
-5 -5
-5 -5
0.00

(解析:X轴合力 1055=010-5-5=0,Y轴同理。)

数据范围

  • 1N100,0001 \le N \le 100,000
  • 1000Fx,i,Fy,i1000-1000 \le F_{x,i}, F_{y,i} \le 1000
  • 注意:虽然单个力不大,但 NN 很大,累加后的平方运算可能会超过 int (21亿) 的范围。