1 条题解
-
0
📝 题目大意
给定一个 的比赛结果表, 表示第 个人对第 个人的赛果(
W胜、L负、D平,-表示对角线)。判断是否存在矛盾——即 与 是否对称一致(胜对负、负对胜、平对平)。💡 解题思路
-
题目分析:, 刚好遍历所有 对,不会超时。矛盾条件本质上是要求 和 互为对称结果。
-
算法推导:
- 遍历所有 的组合,令 ,。
- 三条矛盾判断规则:
- 若 ( 胜 ),则 必须为 ( 负 ),否则矛盾;
- 若 ( 负 ),则 必须为 ( 胜 ),否则矛盾;
- 若 ( 平 ),则 必须为 ( 平 ),否则矛盾。
- 一旦发现矛盾,将标记
correct置为false。 - 最终根据标记输出
"correct"或"incorrect"。
-
边界与细节:
- 对角线 恒为
-,跳过不检查。 - 每一对 会被检查两次(一次从 侧,一次从 侧),但这是冗余安全的,不会导致误判。可以用 优化为只检查一次,但 在此数据范围下已足够。
- 对角线 恒为
⏱️ 复杂度分析
- 时间复杂度:,遍历所有 对。
- 空间复杂度:,存储整个 的表格。
💻 标准代码 (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
- 上传者