1 条题解
-
0
📝 题目大意
给定一个长度为 8 的字符串 S,包含恰好 1 个 K、1 个 Q、2 个 R、2 个 B、2 个 N。判断是否满足:(1) 两个 B 的位置奇偶性不同;(2) K 位于两个 R 之间。
💡 解题思路
- 题目分析:字符串长度固定为 8,字符种类和数量固定,数据规模极小。只需按定义直接检查两个条件即可,无需任何优化。
- 算法推导:
- 遍历字符串 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。
- 遍历字符串 S,记录两个 B 的位置(
- 边界与细节:
- 使用 1-indexed 位置(
i+1)而非 0-indexed,因为奇偶性判断基于自然数位置(从 1 开始),两种方式均可但需保持一致。std.cpp 使用 1-indexed,条件 1 等价于判断位置之和是否为奇数。 - 条件 2 中 K 必须严格位于两个 R 之间,
x < z < y,不能等于。
- 使用 1-indexed 位置(
⏱️ 复杂度分析
- 时间复杂度:,仅需一次遍历。
- 空间复杂度:,仅需存储少量位置变量。
💻 标准代码 (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
- 上传者