题解:P10519 [XJTUPC2024] 转呀转

· · 题解

洛谷P10519

题目大意

求一点 (x, y) 在圆心为 (0, 0) 的圆周上运动 t \times v 圈后的位置与初始位置的直线距离。

思路

考虑到初始点、结束点、圆心形成一个三角形,并且有两边长为 r,即 (x, y)(0,0) 点的距离。两边夹角也不难计算,所以可以使用余弦定理求解距离。(不知道余弦定理的点这里)但是,余弦定理所需要使用的 cos 函数在 C++ 里只能提供弧度参数,所以需要通过以下公式将角度转换成弧度:

\text{radian}=\text{perspectives} \times \dfrac{\pi}{180}

AC代码

#include <bits/stdc++.h>
using namespace std;
const double pi = 3.14159265358979323846; 
double mod1(double x) { //取小数部分
  return x - (int)(x);
}
signed main() {
    double x, y, t, v;
    cin >> x >> y >> t >> v;
    double circles = mod1(t * v), pers = 360.0 * circles;
    if (pers > 180)
        pers = 360 - pers; //避免炸掉,先转换成小于等于 180 度的角
    double rad = pers * (pi / 180.0);
    double r = sqrt(x * x + y * y); //求与 (0, 0) 的直线距离(经过简化,和公式有所出入)
    double ans = r * r + r * r - 2 * r * r * cos(rad); //核心公式,两边距离 a 和 b 都是半径,所以全部用 r 指代
    cout << fixed << setprecision(10) << sqrt(ans);
    return 0;
}

总结

这道题代码难度不大,但对数学方面有一定的要求,比如弧度的转换公式和余弦定理,建议有一定数学功底再完成本题。