酷代码 AI
菜单
全部AI  /  热门  /  AI写代码神器
服务商

33DAI 拿到了 n n 个神奇的加速珠,每个加速珠要么是红色的要么是蓝色的。 这些加速珠初始排成了一排,第 i i 个加速珠的颜色是 a i a i ​ (r 表示红色,b 表示蓝色)。 很可惜,初始的排列方式有可能无法达到加速效果。只有当加速珠排列程红蓝相间(相邻两个加速珠颜色不一样)时才会有加速效果。 比如 rbrbrb、brbrbrb、rb、r 都有加速效果, 但是 bbr、rbbr、rr 这些排列方式都没有加速效果。 现在为了让加速珠有加速效果,你可以挑选前面的一些珠子,将其翻转到末尾。请问你最少选择几个珠子才能达到加速效果(如果怎么也无法达到加速效果,输出 -1)。

以下是使用 Python 实现的解决方案: ```python def min_rotate_to_effective(arr): n = len(arr) # 尝试所有可能的翻转情况 min_flip = float('inf') for i in range(n): # 进行翻转 new_arr = arr[i:] + arr[:i] # 检查翻转后的排列是否红蓝相间 valid = True for j in range(1, n): if new_arr[j] == new_arr[j - 1]: valid = False break if valid: min_flip = min(min_flip, i) # 如果没有找到有效的排列,返回 -1 if min_flip == float('inf'): return -1 return min_flip # 读取输入 n = int(input()) a = input() # 调用函数并输出结果 result = min_rotate_to_effective(a) print(result) ``` 代码解释 1. 函数定义:`min_rotate_to_effective` 函数接受一个字符串表示的加速珠排列,返回最少需要翻转的珠子数量。 2. 尝试所有可能的翻转情况:使用 `for` 循环遍历所有可能的翻转位置 `i`,将前 `i` 个珠子翻转到末尾得到新的排列 `new_arr`。 3. 检查排列是否有效:对于每个新的排列,使用 `for` 循环检查相邻的珠子是否颜色不同。如果发现相邻珠子颜色相同,则该排列无效。 4. 记录最小翻转数量:如果排列有效,则更新最小翻转数量 `min_flip`。 5. 返回结果:如果没有找到有效的排列,返回 -1;否则返回最小翻转数量。 额外注意的逻辑点 1. 边界条件:当输入的加速珠数量为 0 或 1 时,直接判断为有效排列,无需翻转。 2. 循环优化:在检查排列是否有效时,如果发现相邻珠子颜色相同,可以立即停止检查,避免不必要的计算。 3. 字符串拼接:在进行翻转操作时,使用字符串拼接 `new_arr = arr[i:] + arr[:i]`,注意拼接顺序。 [2025-07-30 17:00:55 | AI写代码神器 | 506点数解答]

相关提问