P12130 [蓝桥杯 2025 省 B] 移动距离 题解
chess_OIer
·
·
题解
题目传送门
题意
从 (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()$ 无限逼近也可以。