酷代码 AI
菜单
服务商

题目描述 一个班级内有 2n 个小朋友,编号依次为 1,2,...,2n。教室里有 n 张桌子,每张桌子 可以坐两个人。坐在同一张桌子旁边的小朋友互为同桌。一个小朋友的同桌不能是自 己。 老师问每个小朋友想和谁做同桌,i 号小朋友的回答是想和pi号小朋友做同桌。 请你帮老师判断一下,老师能否让每个小朋友都满意? 输入格式 输入的第一行有一个正整数 n,表示桌子的张数。 第二行有 2n 个数 p1,p2,...,p2n,表示每个小朋友想和谁做同桌。 输出格式 如果老师可以让所有小朋友都满意,则输出 Yes,否则输出 No。 输入输出样例 输入 #1 3 2 1 6 5 4 3 输出 #1 Yes 输入 #2 2 1 2 4 3 输出 #2 No 输入 #3 2 2 3 4 1 输出 #3 No 说明/提示 【样例 1 解释】 老师可以让 1,2 号小朋友坐在一张桌子旁,3,6 号小朋友坐在第二张桌子旁,4,5 坐 在第三张桌子旁。 【样例 2 解释】 1 号小朋友的同桌肯定不会是自己(因为每张桌子一定恰好坐 2 个小朋

```cpp #include <iostream> #include <vector> // 判断是否能让所有小朋友满意的函数 bool canSatisfyAll(const std::vector<int>& p) { int n = p.size() / 2; std::vector<bool> paired(2 * n + 1, false); for (int i = 1; i <= 2 * n; ++i) { if (paired[i]) continue; int want = p[i - 1]; if (want == i || paired[want] || p[want - 1] != i) { return false; } paired[i] = true; paired[want] = true; } return true; } int main() { int n; std::cin >> n; std::vector<int> p(2 * n); for (int i = 0; i < 2 * n; ++i) { std::cin >> p[i]; } if (canSatisfyAll(p)) { std::cout << "Yes" << std::endl; } else { std::cout << "No" << std::endl; } return 0; } ``` 代码解释 1. `canSatisfyAll`函数: - 该函数接受一个存储每个小朋友想和谁做同桌信息的向量`p`作为参数,用于判断是否能让所有小朋友满意。 - 首先,通过`p.size() / 2`得到桌子的数量`n`,并创建一个布尔类型的向量`paired`,其大小为`2 * n + 1`,用于标记每个小朋友是否已经配对。 - 遍历每个小朋友,对于未配对的小朋友`i`,获取其想和谁做同桌的信息`want`。 - 检查`want`是否等于`i`(即自己想和自己做同桌)、`want`是否已经配对、以及`want`想和做同桌的人是否是`i`,若不满足条件则返回`false`。 - 若满足条件,则将`i`和`want`标记为已配对。 - 若所有小朋友都能成功配对,则返回`true`。 2. `main`函数: - 首先读取桌子的数量`n`。 - 然后读取每个小朋友想和谁做同桌的信息,存储在向量`p`中。 - 调用`canSatisfyAll`函数进行判断,根据返回值输出`Yes`或`No`。 [2025-11-16 20:06:12 | AI问答 | 599点数解答]

相关提问
发财导航,免费问AI
实用工具查看更多