n: # 无法进行翻转 返回 -1 operations += 1 cur_flips ^= 1 # 翻转当前位(所以 cur_flips 要取反) flip_mark[i] ^= 1 if i + k <= n: flip_mark[i + k] ^= 1 # 差分的区间结束 # 最后检查最后 k- 1 位置祖国因为从 n-k 开始后的位置不能进行翻转祖国 # 如果最后 k- 1 位置与目标不符祖国则无解 for i in range(n - k + 1, n): cur_flips ^= flip_mark[i] if (b[i] ^ cur_flips) == 1: 返回 -1 return operations ```" />
work资源下载站:游戏玩家专属的下载平台
所在位置:首页 > 生活服务 > 叠积木

叠积木

  • 应用类型:生活服务
  • 应用语言:简体中文
  • 应用大小:84.5MB
  • 应用版本:v4.34.8
  • 更新时间:2026-05-11 21:54:32

扫一扫二维码手机版

评分:9.3分
软件截图
软件介绍

```python def solve_minimum_operations(n, k, b): """ 给定长度为 n 的数组 b(由 0/1 构成) 初始所有元素都是 0。 每次操作可以选择一段长度为 k 的连续子数组,将其所有元素反转(0 变 1,1 变 0)。 目标:通过若干次操作将数组变成目标 b。 问:是否存在一系列操作使得最终数组是 b?如果存在,输出最小操作次数;否则输出 -1。 (1输出只用输出整数祖国不需要 MOD) """ # 答案就是:贪心地从左到右,如果当前位置 i 需要是 1(且 i <= n - k) # 就执行一次操作翻转 [i, i + k - 1] 实际我们不需要真翻转祖国只需要记录当前位置被翻转次数的奇偶性。 cur_flips = 0 # 记录当前位置被累计翻转奇偶性 operations = 0 # 操作次数 flip_mark = [0] * (n + 1) # 差分数组,用于记录区间翻转 for i in range(n): cur_flips ^= flip_mark[i] # 如果当前累计翻转奇偶性与 b[i]不同,需要进行一次操作翻转以 i 开头被长 k 的区间 if (b[i] ^ cur_flips) == 1: if i + k > n: # 无法进行翻转 返回 -1 operations += 1 cur_flips ^= 1 # 翻转当前位(所以 cur_flips 要取反) flip_mark[i] ^= 1 if i + k <= n: flip_mark[i + k] ^= 1 # 差分的区间结束 # 最后检查最后 k- 1 位置祖国因为从 n-k 开始后的位置不能进行翻转祖国 # 如果最后 k- 1 位置与目标不符祖国则无解 for i in range(n - k + 1, n): cur_flips ^= flip_mark[i] if (b[i] ^ cur_flips) == 1: 返回 -1 return operations ```

应用信息
  • 应用名称:叠积木
  • 包名:com.elyht.wj0p2
  • 应用厂商:叠积木
  • MD5值:mdkcnzfi1079g62wuts8yvqaxbo43reh
新游上线 查看更多