专栏文章

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

P12130题解参与者 1已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mipl3kfg
此快照首次捕获于
2025/12/03 13:46
3 个月前
此快照最后确认于
2025/12/03 13:46
3 个月前
查看原文

题目传送门


题意

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

思路

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

对结论的证明:

首先,初始位置在原点,第一步只能是水平移动(圆周移动需半径非零)。水平移动到目标点所在圆后,沿圆周移动是唯一直接到达的方式。
其次,若尝试先水平移动到更小半径再圆周移动,需额外水平移动调整,总距离反而更长。例如,水平移动至较小半径 r,再圆周移动至某点后水平移动,计算表明总距离必然超过结论距离。
最后,通过数学验证,水平移动到 R 后沿圆周移动的总距离为最小值。其他组合方式(如多次交替移动)会引入冗余路径,无法更优。
那么,我们把这个题分成两部分:

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

可以看出这个距离就是原点到坐标 (233,666)(233,666) 的距离。
根据勾股定理,可得距离 D 为:
D=2332+6662705.51D=\sqrt{233^2+666^2} ≈ 705.51

2.计算弧的长度

根据弧的长度公式,弧长
l=θπR180l = \frac{\theta\pi R}{180}
问题来了,θ\theta (圆周角)是多大?
这时反三角函数就登场了!
θ=arctan(666233)\theta = \arctan(\frac{666}{233})
arctan()\arctan() 是反正切,这里贴上百度对反正切的定义:

arctan的定义

arctan是Arctangent的缩写,指反正切函数,它是数学术语,属于反三角函数之一,是正切函数 y=tanxy = \tan x 的反函数。简单来说,它是一种求逆的运算,就如同乘法的逆运算是除法一样。

综上,我们可以算出,
θ=arctan(666/233)=arctan(2.85837)70.7176\theta=\arctan(666/233)=\arctan(2.85837) ≈ 70.7176
带入公式,得弧长
l=70.7176×705.5×3.1416180=870.76887l = \frac{70.7176\times705.5\times3.1416}{180} = 870.76887
总长 D+l=870.8+705.5=1576.3D+l = 870.8 + 705.5 = 1576.3
这里取整 15761576

代码:
CPP
#include<iostream>
int main(){
    std::cout<<"1576";
}

update

其实这题用 arcsin()\arcsin() 也可以做,还有泰勒展开。
如果都不会,sin()\sin() 无限逼近也可以。

评论

1 条评论,欢迎与作者交流。

正在加载评论...