满汉全席大赛:用 Python 算法探寻厨师通关密码!
以下是使用 Python 实现的解决方案: ```python # 并查集类,用于实现 2 - SAT 问题中的并查集操作 class UnionFind: def __init__(self, n): # 初始化每个元素的父节点为自身 self.parent = list(range(2 * n)) # 初始化每个集合的大小为 1 self.size = [1] * (2 * n) def find(self, x): # 查找元素 x 的根节点,并进行路径压缩 if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, x, y): # 合并元素 x 和 y 所在的集合 root_x = self.find(x) root_y = self.find(y) if root_x != root_y: if self.size[root_x] < self.size[root_y]: root_x, root_y = root_y, root_x self.parent[root_y] = root_x self.size[root_x] += self.size[root_y] def is_same_set(self, x, y): # 判断元素 x 和 y 是否在同一个集合中 return self.find(x) == self.find(y) def solve(): t = int(input()) # 读取测试数据的组数 for _ in range(t): n, m = map(int, input().split()) # 读取材料的数量和评审员的数量 uf = UnionFind(n) for _ in range(m): # 读取每个评审员的喜好 a, b = input().split() # 解析第一个喜好的编号和类型 idx_a = int(a[1:]) - 1 type_a = 0 if a[0] == 'h' else 1 # 解析第二个喜好的编号和类型 idx_b = int(b[1:]) - 1 type_b = 0 if b[0] == 'h' else 1 # 根据 2 - SAT 问题的逻辑进行并查集的合并操作 uf.union(idx_a * 2 + (1 - type_a), idx_b * 2 + type_b) uf.union(idx_b * 2 + (1 - type_b), idx_a * 2 + type_a) can_pass = True for i in range(n): # 检查是否存在矛盾 if uf.is_same_set(i * 2, i * 2 + 1): can_pass = False break if can_pass: print("GOOD") else: print("BAD") # 调用 solve 函数解决问题 solve() ``` 代码解释: 1. 并查集类 `UnionFind`: - `__init__(self, n)`:初始化并查集,每个元素的父节点为自身,每个集合的大小为 1。 - `find(self, x)`:查找元素 `x` 的根节点,并进行路径压缩。 - `union(self, x, y)`:合并元素 `x` 和 `y` 所在的集合。 - `is_same_set(self, x, y)`:判断元素 `x` 和 `y` 是否在同一个集合中。 2. `solve` 函数: - 读取测试数据的组数 `t`。 - 对于每组测试数据,读取材料的数量 `n` 和评审员的数量 `m`。 - 对于每个评审员的喜好,根据 2 - SAT 问题的逻辑进行并查集的合并操作。 - 检查是否存在矛盾,如果存在矛盾则输出 `BAD`,否则输出 `GOOD`。 复杂度分析: - 时间复杂度:$O(t * m * \alpha(n))$,其中 $t$ 是测试数据的组数,$m$ 是评审员的数量,$n$ 是材料的数量,$\alpha(n)$ 是阿克曼函数的反函数,近似为常数。 - 空间复杂度:$O(n)$,主要用于并查集的存储。 ######[AI问答 | 954点数解答 | 2025-12-13 10:47:33]
- Python 运行报错:urllib3 网络连接创建失败,原因及排查建议(字节豆包 | 161点数解答 | 2024-10-31 00:39:36)469
- React+shadcn/ui实现单人狼人杀:含完整代码与复杂规则逻辑(阿里通义 | 950点数解答 | 2025-02-26 04:19:06)158
- Python 实战:学生信息列表转字典、遍历、深拷贝及数据修改全流程(GPT | 422点数解答 | 2024-10-29 15:43:54)426
- Python实战:学生成绩列表转字典,深拷贝与数据修改操作全解析(字节豆包 | 254点数解答 | 2024-10-29 16:01:39)417
- Python 在 Windows 系统下编程实现 RSA 算法对照片加密与解密(字节豆包 | 373点数解答 | 2025-01-05 18:35:28)366
- Python 在 Windows 系统下编程实现 RSA 算法对照片加密与解密:附代码及注意事项(GPT | 1269点数解答 | 2025-01-05 18:37:09)249
- Python在Windows系统下实现RSA算法对手写签名照片加密解密,附代码及关键逻辑 (GPT | 786点数解答 | 2025-01-05 18:37:20)311
- Java调用Python接口中文乱码?设置UTF - 8编码一招解决!(讯飞星火 | 263点数解答 | 2024-06-06 17:07:59)400
- 解决Java调用Python接口中文乱码问题:设置UTF - 8编码全攻略(讯飞星火 | 160点数解答 | 2024-06-06 17:18:39)423
- Java调用Python接口中文乱码问题:字符编码统一解决方案(讯飞星火 | 344点数解答 | 2024-06-06 17:19:55)534
- 解决Java调用Python接口时中文值乱码问题:设置字符编码为UTF-8(讯飞星火 | 264点数解答 | 2024-06-06 17:27:09)398
- Python切片操作巧解经典算法:二维数组90°旋转(阿里通义 | 205点数解答 | 2023-10-31 11:05:29)340