1 条题解

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

    📝 题目大意

    给定一个 N×NN \times N 的比赛结果表,Ai,jA_{i,j} 表示第 ii 个人对第 jj 个人的赛果(W 胜、L 负、D 平,- 表示对角线)。判断是否存在矛盾——即 Ai,jA_{i,j}Aj,iA_{j,i} 是否对称一致(胜对负、负对胜、平对平)。

    💡 解题思路

    1. 题目分析N1000N \leq 1000O(N2)O(N^2) 刚好遍历所有 (i,j)(i,j) 对,不会超时。矛盾条件本质上是要求 Ai,jA_{i,j}Aj,iA_{j,i} 互为对称结果。

    2. 算法推导

      • 遍历所有 iji \neq j 的组合,令 x=Ai,jx = A_{i,j}y=Aj,iy = A_{j,i}
      • 三条矛盾判断规则:
        • x=Wx = \texttt{W}iijj),则 yy 必须为 L\texttt{L}jjii),否则矛盾;
        • x=Lx = \texttt{L}iijj),则 yy 必须为 W\texttt{W}jjii),否则矛盾;
        • x=Dx = \texttt{D}iijj),则 yy 必须为 D\texttt{D}jjii),否则矛盾。
      • 一旦发现矛盾,将标记 correct 置为 false
      • 最终根据标记输出 "correct""incorrect"
    3. 边界与细节

      • 对角线 i=ji = j 恒为 -,跳过不检查。
      • 每一对 (i,j)(i,j) 会被检查两次(一次从 ii 侧,一次从 jj 侧),但这是冗余安全的,不会导致误判。可以用 j<ij < i 优化为只检查一次,但 O(N2)O(N^2) 在此数据范围下已足够。

    ⏱️ 复杂度分析

    • 时间复杂度O(N2)O(N^2),遍历所有 (i,j)(i,j) 对。
    • 空间复杂度O(N2)O(N^2),存储整个 N×NN \times N 的表格。

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main(){
        int N;
        cin >> N;
        vector<string> A(N);          // 存储 N 行比赛结果字符串
        for(int i = 0; i < N; i++) {
            cin >> A[i];
        }
    
        bool correct = true;          // 标记是否存在矛盾,初始假设无矛盾
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < N; j++) {
                if(i == j) continue;  // 跳过对角线 '-'
                char x = A[i][j];     // i 对 j 的结果
                char y = A[j][i];     // j 对 i 的结果
                // 三条矛盾判断:胜对负、负对胜、平对平
                if(x == 'W' && y != 'L') correct = false;
                if(x == 'L' && y != 'W') correct = false;
                if(x == 'D' && y != 'D') correct = false;
            }
        }
        cout << (correct ? "correct" : "incorrect") << endl;
        return 0;
    }
    
    • 1

    信息

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