1 条题解

  • 0
    @ 2025-10-28 9:19:10

    题目理解

    我们需要模拟激光在平面上的传播过程:

    • 激光从 (x,y)(x, y) 点出发,方向为 (dx,dy)(d_x, d_y)
    • nn 条线段作为偏转装置
    • 当激光碰到偏转装置时,会根据特殊规则改变方向
    • 记录激光前10次碰到的偏转装置编号

    关键规则分析

    1. 偏转规则

    • 传统反射:入射角 = 反射角
    • 本题规则:β=λα\beta = \lambda \alpha,其中 λ=ab\lambda = \frac{a}{b}
    • α\alpha 是入射角(光线与法线的夹角)
    • β\beta 是出射角

    2. 特殊情况

    • 如果激光平行于线段:不偏转
    • 如果激光射到端点:发生偏转
    • 两面都可偏转
    • β>π2\beta > \frac{\pi}{2} 时可能偏转到另一面

    几何计算要点

    1. 射线与线段求交

    设射线:P=P0+tdP = P_0 + t \cdot \vec{d}t>0t > 0 线段:Q1Q_1Q2Q_2

    需要找到最小的 t>0t > 0 使得 PP 在线段上。

    2. 法向量计算

    对于线段 (x1,y1)(x_1,y_1)(x2,y2)(x_2,y_2),方向向量 v=(x2x1,y2y1)\vec{v} = (x_2-x_1, y_2-y_1) 法向量有两个:n1=(vy,vx)\vec{n}_1 = (-v_y, v_x)n2=(vy,vx)\vec{n}_2 = (v_y, -v_x)

    3. 入射角计算

    设入射光线方向 d\vec{d},法向量 n\vec{n} 入射角 $\alpha = \arccos\left(\frac{|\vec{d} \cdot \vec{n}|}{\|\vec{d}\| \|\vec{n}\|}\right)$

    4. 出射方向计算

    根据 β=λα\beta = \lambda \alpha 计算新的出射角,然后确定新的方向向量。


    算法流程

    主循环:

    1. 从当前点 PP 和方向 d\vec{d} 出发
    2. 找出所有可能与当前射线相交的偏转装置
    3. 选择最近的有效交点(tt 最小且 t>0t > 0
    4. 如果没有交点:结束
    5. 在交点处计算偏转:
      • 计算入射角 α\alpha
      • 计算出射角 β=λα\beta = \lambda \alpha
      • 确定新的方向 d\vec{d}'
    6. 记录偏转装置编号
    7. 如果已记录10次:结束
    8. 否则以新起点和新方向继续

    实现细节

    1. 交点判断

    使用参数方程:

    • 射线:(x,y)=(x0,y0)+t(dx,dy)(x,y) = (x_0,y_0) + t(d_x,d_y)
    • 线段:(x,y)=(x1,y1)+s(x2x1,y2y1)(x,y) = (x_1,y_1) + s(x_2-x_1,y_2-y_1)0s10 \leq s \leq 1

    解方程组求 ttss,要求 t>0t > 00s10 \leq s \leq 1

    2. 法向量选择

    根据入射方向选择正确的法向量(使入射角 π2\leq \frac{\pi}{2})。

    3. 方向更新

    计算出射角后,需要确定新的方向向量:

    • 保持与法向量垂直的分量方向
    • 根据 β\beta 调整大小

    样例分析

    输入:

    0 2 1 0
    2
    0 4 3 1 1 1
    4 0 0 -4 1 1
    

    过程:

    1. (0,2)(0,2) 方向 (1,0)(1,0)(向右水平)
    2. 首先碰到线段1:(0,4)(0,4)(3,1)(3,1)
      • 计算偏转,得到新方向
    3. 然后碰到线段2:(4,0)(4,0)(0,4)(0,-4)
      • 再次偏转
    4. 输出:1 2

    复杂度分析

    • 每次偏转需要检查所有 nn 个线段:O(n)O(n)
    • 最多10次偏转:O(10n)O(10n)
    • 对于 n100n \leq 100 非常高效

    总结

    本题的关键在于:

    1. 精确的几何计算(射线线段求交)
    2. 理解特殊的偏转规则 β=λα\beta = \lambda \alpha
    3. 正确处理法向量选择和方向更新
    4. 处理边界情况(平行、端点等)
    • 1

    信息

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