1 条题解

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

    📝 题目大意

    正五边形的顶点按顺序标号为 A、B、C、D、E。给定两对顶点 (S1,S2)(S_1, S_2)(T1,T2)(T_1, T_2),判断这两条线段的长度是否相等。

    💡 解题思路

    1. 题目分析:正五边形只有 5 个顶点,任意两点间的线段长度仅取决于它们在五边形上的"最短步数"(即沿边行走的最少边数)。由于五边形是正多边形,步数相同的线段长度必然相等;步数不同的线段长度必然不等。可能的最短步数只有两种:1(相邻顶点)和 2(隔一个顶点)。

    2. 算法推导

      • 将字母 A~E 映射为下标 00~44index 函数)。
      • 对于一对顶点 (a,b)(a,b),它们在环上的最短距离为 d=min(ab,5ab)d = \min(|a-b|, 5 - |a-b|)。这里 5ab5 - |a-b| 表示绕环另一方向走的步数。
      • 分别计算 (S1,S2)(S_1,S_2) 的距离 d1d_1(T1,T2)(T_1,T_2) 的距离 d2d_2
      • d1=d2d_1 = d_2 则输出 Yes,否则输出 No
    3. 边界与细节

      • 输入保证 S1S2S_1 \neq S_2T1T2T_1 \neq T_2,因此 d1,d2d_1, d_2 不会为 00
      • 因为只有 5 个点,dd 的取值只能是 1122,直接比较即可。
      • 注意环上距离要用 min(直接差, 5-直接差) 来取较短的那条路径。

    ⏱️ 复杂度分析

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

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    #include <cmath>
    using namespace std;
    
    // 将字母 A~E 映射为下标 0~4
    int index(char c) {
        return c - 'A';
    }
    
    int main() {
        string s, t;
        cin >> s >> t;
        // 获取两对顶点的下标
        int a = index(s[0]), b = index(s[1]);
        int x = index(t[0]), y = index(t[1]);
        // 环上最短距离:min(直接距离, 绕环另一方向距离)
        int d1 = min(abs(a - b), 5 - abs(a - b));
        int d2 = min(abs(x - y), 5 - abs(x - y));
        // 步数相同则长度相等
        if (d1 == d2) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
        return 0;
    }
    
    • 1

    信息

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