P12130 [蓝桥杯 2025 省 B] 移动距离 题解

· · 题解

题目传送门

题意

(0,0)(233,666),只允许水平向右移动或以原点为中心旋转,求最短路至整数。

思路

本题可以证明,只回头一次一定不劣(证明放在下面了)。
准确来说,回头几次都无所谓,但是一次好算啊!
所以,我们可以先求 x 轴上距离(就是我们第一次要走的),再走弧即可到达。

对结论的证明:

首先,初始位置在原点,第一步只能是水平移动(圆周移动需半径非零)。水平移动到目标点所在圆后,沿圆周移动是唯一直接到达的方式。

其次,若尝试先水平移动到更小半径再圆周移动,需额外水平移动调整,总距离反而更长。例如,水平移动至较小半径 r,再圆周移动至某点后水平移动,计算表明总距离必然超过结论距离。

最后,通过数学验证,水平移动到 R 后沿圆周移动的总距离为最小值。其他组合方式(如多次交替移动)会引入冗余路径,无法更优。

那么,我们把这个题分成两部分:

1.计算水平方向上要走的距离

可以看出这个距离就是原点到坐标 (233,666) 的距离。
根据勾股定理,可得距离 D 为:

### 2.计算弧的长度 根据弧的长度公式,弧长 $$l = \frac{\theta\pi R}{180}$$。 问题来了,$\theta$ (圆周角)是多大? 这时反三角函数就登场了! $\theta = \arctan(\frac{666}{233}) --- ### arctan的定义 arctan是Arctangent的缩写,指反正切函数,它是数学术语,属于反三角函数之一,是正切函数 $y = \tan x$ 的反函数。简单来说,它是一种求逆的运算,就如同乘法的逆运算是除法一样。 --- 综上,我们可以算出, $$\theta=\arctan(666/233)=\arctan(2.85837) ≈ 70.7176$$。 带入公式,得弧长 $$l = \frac{70.7176\times705.5\times3.1416}{180} = 870.76887$$。 总长 $D+l = 870.8 + 705.5 = 1576.3$。 这里取整 $1576$。 --- 代码: ```cpp #include<iostream> int main(){ std::cout<<"1576"; } ``` ### update 其实这题用 $\arcsin()$ 也可以做,还有泰勒展开。 如果都不会,$\sin()$ 无限逼近也可以。