1 条题解

  • 0
    @ 2026-6-19 10:30:08

    📝 题目大意

    给定平面上的点 (a,b)(a, b) 和角度 dd(度数),求将该点绕原点逆时针旋转 dd 度后的新坐标 (a,b)(a', b')。允许误差 10610^{-6}

    💡 解题思路

    1. 题目分析:坐标范围 [1000,1000][-1000, 1000]d[1,360]d \in [1, 360],均为整数。表面是几何题,本质是矩阵乘法——二维平面上的旋转变换。输出要求误差不超过 10610^{-6},使用 double + setprecision(10) 即可满足。

    2. 算法推导

      • 将角度 dd 从度数转为弧度:rad=d×π180\text{rad} = d \times \frac{\pi}{180}(代码中 M_PI<cmath> 提供的 π\pi 常量)。
      • 逆时针旋转 θ\theta 的变换矩阵为:$$\begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix}$$
      • 因此新坐标:a=acosθbsinθa' = a \cos\theta - b \sin\theta b=asinθ+bcosθb' = a \sin\theta + b \cos\theta
      • 直接套公式输出即可,无需任何分类讨论。
    3. 边界与细节

      • 原点(0,0)(0, 0) 旋转后仍为 (0,0)(0, 0),公式自然成立,无需特判。
      • d=360d = 360sin360=0\sin 360^\circ = 0cos360=1\cos 360^\circ = 1,坐标不变,公式同样成立。
      • 负坐标:输入可为负数,三角函数正确处理,无需额外处理。
      • WA 陷阱:注意 sin/cos 接受的是弧度而非度数,务必先转换;输出精度不要低于 10610^{-6}setprecision(10) 足够。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1),仅常数次算术运算。
    • 空间复杂度O(1)O(1),只使用几个变量。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
        double a, b, d;
        cin >> a >> b >> d;
    
        // 将角度从度数转换为弧度(C++三角函数使用弧度制)
        double rad = d * M_PI / 180.0;
    
        // 逆时针旋转变换:应用二维旋转矩阵
        double a2 = a * cos(rad) - b * sin(rad);
        double b2 = a * sin(rad) + b * cos(rad);
    
        // 固定输出10位小数,满足 10^{-6} 精度要求
        cout << fixed << setprecision(10) << a2 << " " << b2 << endl;
    
        return 0;
    }
    
    • 1

    信息

    ID
    616
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者