1 条题解

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

    📝 题目大意

    给定一个长度为 8 的字符串 S,包含恰好 1 个 K、1 个 Q、2 个 R、2 个 B、2 个 N。判断是否满足:(1) 两个 B 的位置奇偶性不同;(2) K 位于两个 R 之间。

    💡 解题思路

    1. 题目分析:字符串长度固定为 8,字符种类和数量固定,数据规模极小。只需按定义直接检查两个条件即可,无需任何优化。
    2. 算法推导
      • 遍历字符串 S,记录两个 B 的位置(Bpos[0]Bpos[1])、两个 R 的位置(Rpos[0]Rpos[1])以及 K 的位置(Kpos),均使用 1-indexed。
      • 条件 1:判断 Bpos[0]Bpos[1] 的奇偶性是否不同,即 (Bpos[0] % 2) != (Bpos[1] % 2)
      • 条件 2:判断 K 是否在两个 R 之间。由于 R 只有两个,只需检查 Kpos 是否严格介于 Rpos[0]Rpos[1] 之间,即 Rpos[0] < Kpos < Rpos[1]Rpos[1] < Kpos < Rpos[0]
      • 两个条件同时满足则输出 Yes,否则输出 No
    3. 边界与细节
      • 使用 1-indexed 位置(i+1)而非 0-indexed,因为奇偶性判断基于自然数位置(从 1 开始),两种方式均可但需保持一致。std.cpp 使用 1-indexed,条件 1 等价于判断位置之和是否为奇数。
      • 条件 2 中 K 必须严格位于两个 R 之间,x < z < y,不能等于。

    ⏱️ 复杂度分析

    • 时间复杂度O(S)=O(8)=O(1)O(|S|) = O(8) = O(1),仅需一次遍历。
    • 空间复杂度O(1)O(1),仅需存储少量位置变量。

    💻 标准代码 (C++)

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    
    int main() {
        string S;
        cin >> S;
        
        // 分别记录 B、R、K 的位置(1-indexed)
        vector<int> Bpos, Rpos;
        int Kpos;
        for (int i = 0; i < 8; i++) {
            if (S[i] == 'B') Bpos.push_back(i + 1);      // 收集 B 的位置
            else if (S[i] == 'R') Rpos.push_back(i + 1);  // 收集 R 的位置
            else if (S[i] == 'K') Kpos = i + 1;           // 记录 K 的位置
        }
        
        // 条件1:两个 B 的位置奇偶性不同
        bool cond1 = (Bpos[0] % 2) != (Bpos[1] % 2);
        
        // 条件2:K 严格位于两个 R 之间
        bool cond2 = (Rpos[0] < Kpos && Kpos < Rpos[1]) 
                  || (Rpos[1] < Kpos && Kpos < Rpos[0]);
        
        // 两个条件同时满足才输出 Yes
        if (cond1 && cond2) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
        return 0;
    }
    
    • 1

    信息

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