华为 · 排序 · 算法编程题
华为 排序 n ≤ 20 时限 1 秒 / 256 MB

题目描述

在一个前沿的量子计算实验中,一组 n 个量子比特(qubit)被初始化到一个特定的纠缠态。
然而,为了进行下一步的计算,必须将所有量子比特精确地重置到基态,即 |0 态。
由于量子纠缠的复杂性,对单个量子比特施加操作门(quantum gate)不仅会改变其自身的状态,还可能同时翻转其他与之纠缠的量子比特的状态。
系统的状态可以用一个 n 维的二进制向量 S = (s_1, s_2, ..., s_n) 来描述,其中 s_i ∈ \0, 1 。 s_i = 1 表示第 i 个量子比特处于激发态 |1 , s_i = 0 表示处于基态 |0 。
我们有 n 种量子门操作,记为 G_1, G_2, ..., G_n 。施加操作 G_i 的效果如下:
1. 必定会翻转第 i 个量子比特的状态,即 s_i → 1 - s_i 。
2. 由于纠缠效应,施加 G_i 还会翻转一系列其他量子比特 s_j, s_k, ... 的状态。
每次操作都是一个翻转操作(异或 1 )。同一个操作施加两次会抵消其效果。我们的目标是找到一个操作序列,使得系统从初始状态 S_initial 演化到全零向量 S_final = (0, 0, ..., 0) 。
给定系统的初始状态和所有 n 种操作的纠缠影响关系,请找出一个解决方案。如果不存在任何解决方案,则输出 -1 。若存在多种解决方案,您需要输出满足以下条件的最优解:
1. 施加的操作门数量最少。
2. 在数量最少的基础上,选择操作序列的字典序最小的方案(即操作的量子比特编号组成的序列)。

输入输出

输入描述
第一行包含两个整数 n 和 m ,分别代表量子比特的数量和额外的纠缠关系数量。数据范围为 1 ≤ n ≤ 20 , 0 ≤ m ≤ n · (n - 1) 。
第二行包含 n 个整数,表示初始状态向量 S_initial 。第 i 个整数 s_i ∈ \0, 1 代表第 i 个量子比特的初始状态。
接下来的 m 行,每行包含两个整数 x, y ( 1 ≤ x, y ≤ n, x ≠ y ),表示施加量子门 G_x 会额外翻转量子比特 y 的状态。
输出描述
如果无解,输出一行 -1 。
如果有解,输出一行升序排列的整数,代表最优操作序列中需要施加的量子门的编号。整数之间用单个空格分隔。

样例共 2 组

样例 1
输入
3 5
1 1 1
1 2
2 1
2 3
3 1
3 2
输出
2
样例 2
输入
4 6
1 0 0 0
1 4
2 1
2 4
3 1
4 2
4 3
输出
-1

算法解析依据一般

考点:排序

数据规模 n ≤ 20 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:n ≤ 20
  • 复杂度门槛:允许指数级做法:暴力枚举全部子集 2^n / 回溯搜索 / 状压 DP。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

参考方向:排序

先用 O(n log n) 排序把无序变有序,后续处理往往就简单了。

思路框架(排序 通法 · 非本题专属)

  1. 排序后很多性质变简单:相邻关系、前缀性质、二分可行。
  2. 若题目禁止使用排序库函数,则手写快排/归并(归并还能顺带求逆序对)。
  3. 排序常与其他范式组合,比如「排序 + 贪心」「排序 + 二分」「排序 + 双指针」。

实现要点:在 C++ 中用 std::sort,Python 用 sorted();注意自定义比较函数的严格弱序。

复杂度:时间 O(n log n) | 空间 O(log n) ~ O(n)

该范式的通法易错点

  • 自定义比较函数不满足严格弱序会导致运行时崩溃。
  • 排序后丢失原始下标,题目需要下标时记得用 pair 一起排。

对照本题

  • 数据规模 n ≤ 20,允许指数级做法:暴力枚举全部子集 2^n / 回溯搜索 / 状压 DP。
本题在源数据中没有官方考点标签,方向由题面特征推断,仅供参考。

样例

样例 1

  • 输入:3 5 / 1 1 1 / 1 2 / 2 1 / 2 3 / 3 1 / 3 2
  • 输出:2

样例 2

  • 输入:4 6 / 1 0 0 0 / 1 4 / 2 1 / 2 4 / 3 1 / 4 2 / 4 3
  • 输出:-1

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2025年秋招-华为-9月24号开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解