1 条题解

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

    📝 题目大意

    有三个人(编号 1, 2, 3),其中一人吃了蛋糕。两位目击者分别指出人 A 和人 B 不是犯人。问能否唯一确定犯人,若能则输出其编号,否则输出 -1。

    💡 解题思路

    1. 题目分析

      • 数据范围极小:1A,B31 \leq A, B \leq 3,直接枚举都能过。
      • 关键条件:两个目击者提供的信息是"排除"而非"指认"——即 A 和 B 都不是犯人。
      • 总共只有 3 个人,排除 2 个不同的人即可唯一确定犯人。
    2. 算法推导

      • ABA \neq B,则两个人被排除,剩下的唯一一个人就是犯人。由于编号为 1、2、3,利用 1+2+3=61+2+3=6 的性质,犯人编号 = 6AB6 - A - B
      • A=BA = B,则只排除了一个人,剩下两人都有可能,无法唯一确定,输出 -1。
      • 标准代码中使用了枚举所有 ABA \neq B 的情况(共 6 种),本质上是 6AB6 - A - B 的展开写法。
    3. 边界与细节

      • A=BA = B 时必须输出 -1(见样例 2:1 1 → 无法确定是 2 还是 3)。
      • 输入保证 A,B{1,2,3}A, B \in \{1, 2, 3\},无需额外校验。

    ⏱️ 复杂度分析

    • 时间复杂度O(1)O(1)
    • 空间复杂度O(1)O(1)

    💻 标准代码 (C++)

    #include <iostream>
    using namespace std;
    int main() {
        int a, b;
        cin >> a >> b;
        // 若两次指认的是同一个人,则无法唯一确定犯人
        if (a == b) {
            cout << "-1" << endl;
        } else if (a == 1 && b == 2) {
            cout << "3" << endl;  // 1和2被排除,犯人是3
        } else if (a == 1 && b == 3) {
            cout << "2";           // 1和3被排除,犯人是2
        } else if (a == 2 && b == 1) {
            cout << "3" << endl;  // 2和1被排除,犯人是3
        } else if (a == 2 && b == 3) {
            cout << "1" << endl;  // 2和3被排除,犯人是1
        } else if (a == 3 && b == 1) {
            cout << "2" << endl;  // 3和1被排除,犯人是2
        } else if (a == 3 && b == 2) {
            cout << "1" << endl;  // 3和2被排除,犯人是1
        }
        return 0;
    }
    
    • 1

    信息

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