通过率 79% · 提交 389 · 通过 307
小慕正在处理一个项目,需要将一堆苹果分成两堆。 A组希望按照自己的规则来平分苹果:它们的计算方式是二进制加法,但不计算进位。 例如,12 + 5 按照A的规则计算:12的二进制是1100,5的二进制是0101,按位相加不进位得到1001,即9。 B组则使用普通的十进制加法,包含进位。B组希望在满足A组规则的前提下,分到的苹果总重量尽可能多。 现在给定苹果的数量以及每个苹果的重量,请计算在满足A组规则的情况下,B组能获得的最大苹果总重量;如果无法满足A组的要求,则输出-1。
这类题属于华为 OD 机考真题方向中「100分 / 2023B」方向的高频题型,通常考察对「100分 / 2023B」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
苹果的数目跟每个苹果分量
B在满意A的情形下获取的苹果总分量,假如B无法满意A的请求,输出-1。
示例 1
输入示例
3 3 5 6
输出示例
11
示例 2
输入示例
2 12 5
输出示例
-1
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题的题意非常费解,说人话就是:
apples 分成两个部分 apples1 和 apples2,分别作为 A 和 B 获得的苹果数。apples1 和 apples2 求异或和,得到 xorsum1 和 xorsum2。xorsum1 和 xorsum2 需要满足两者相等(即所谓的按照 A 的方法进行苹果平分)。apples1 和 apples2 分别进行十进制求和,得到 apples1_sum 和 apples2_sum。对于给定的任意一个数组 apples,我们需要思考数组本身满足什么条件时,A 的分配规则会得到满足。
由上一步的分析得知,如果 A 的分配规则满足,那么 apples 可以被分成 apples1 和 apples2 两部分,这两部分的异或和 xorsum1 和 xorsum2 满足两者相等的条件:
根据异或操作的性质,很容易得到:
如果把 xorsum1 和 xorsum2 分别展开并使用异或操作交换律,由于 apples1 和 apples2 正好组成了 apples,我们可以得到:
上式的左边部分其实是 apples 数组的异或和。
换句话说,如果 `apples` 数组的异或和为 0,那么 `apples` 数组一定可以拆成 `apples1` 和 `apples2` 两部分,满足 A 的分配规则。进一步地,无论 apples 拆成怎么样的两部分,都能够满足 A 的分配规则。
所以判断 A 的分配规则是否能满足的依据非常简单,即判断 `apples` 的异或和是否等于 0。
如果上述步骤想明白了,剩下的操作实际上非常简单了。由于无论 apples 拆成怎么样的两部分,都能够满足 A 的分配规则,为了让 B 尽可能多地获得苹果,我们只需要贪心地让 A 获得的那一部分 `apples1` 在十进制的数值上尽可能地小即可。A 取最小的结果即为 min(apples),此时 B 获得的苹果数量为 sum(apples) - min(apples),即为答案。
上述核心思路整理成代码,实际上非常简短:
复杂度分析 设 n 为苹果的数量。整段代码只做了几件线性工作:先一次遍历求全体重量的异或和 xorsum,为 O(n);当 xorsum 等于 0 时,再求 sum(nums) 与 min(nums)(C++ 版在同一个循环里同时求和与求最小值),也是一次 O(n) 扫描。没有排序、没有嵌套循环,因此总时间复杂度为 O(n),瓶颈就是这两趟遍历。空间上,除了存放输入的数组本身,只用到 xorsum、总和、最小值这几个标量变量,辅助空间为 O(1)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
示例 3
输入示例
2 12 12
输出示例
12
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有