分苹果 - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷+C卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试

题目描述

A 和 B 两个人要分苹果。A 希望按照他的计算规则得到平均分配的苹果,而 B 希望在满足 A 的条件下获得尽可能多的苹果量。

A 的计算规则是按照二进制加法进行,并不计算进位。例如,12 + 5 = 9 (1100 + 0101 = 1001)。

B 的计算规则是正常的十进制加法,包括进位。

给定苹果的数量和每个苹果的重量,计算并满足 A 的要求的情况下,B 能获得的最大苹果总重量。如果无法满足 A 的要求,则输出 -1。

输入描述

第一行包含一个整数 n,表示苹果的数量。

第二行包含 n 个整数,表示每个苹果的重量 w1, w2, ..., wn。

输出描述

输出一个整数,表示 B 能获得的最大苹果总重量。如果无法满足 A 的要求,则输出 -1。

示例1

输入:
3
3 5 6

输出:
11

说明:
通过二进制无进位加法,A 要求的总重量是 3 XOR 5 XOR 6 = 0,B 能获得所有的苹果,总重量为 11。

示例2

输入:
8
7258 6579 2602 6716 3050 3564 5396 1773

输出:
35165

说明:
同样按照 A 的二进制无进位规则,B 获得最大的苹果重量为 35165。

题解

这道题是一道贪心算法题目,结合二进制无进位加法要求,逐个计算苹果的总重量是否满足 A 的计算规则。在满足 A 的要求下,B 能够获得的苹果总重量最大化。

解题思路

  • 首先计算所有苹果重量的异或和(即 A 的规则),判断这个值是否为 0。
  • 如果异或和不为 0,表示无法满足 A 的要求,直接输出 -1。
  • 如果异或和为 0,A 满足其要求,选择最小的一个苹果,剩余的全部苹果由 B 获得。输出 sum(weights) - min(weights)

时间复杂度:O(n),因为我们需要遍历苹果的重量进行 XOR 运算和求和。

空间复杂度:O(1),只需使用常量的辅助空间。

如果异或和不为 0,表示无法满足 A 的要求,直接输出 -1。这背后的原理可以从 二进制无进位加法(即异或操作)的特性出发详细解释。

1. 二进制无进位加法(XOR 操作)

在这个题目中,A 希望通过异或操作进行“无进位加法”,也就是在二进制中,将两个数逐位进行比较,当两位相同(0 XOR 0 或 1 XOR 1)时,结果为 0;当两位不同(0 XOR 1 或 1 XOR 0)时,结果为 1。例如:

  • 12 (1100) 和 5 (0101) 的异或结果是 9 (1001)。

异或操作有一个非常重要的性质:

  • 自反性:任何数和自身异或都等于 0,即 x ^ x = 0
  • 交换律和结合律a ^ b ^ c 等价于 a ^ (b ^ c),而且可以随意交换操作顺序。

2. 满足 A 要求的条件

A 的目标是:希望多个苹果的重量通过异或操作得到一个结果 0。为了实现这一目标,苹果的权重组合必须满足这样的条件:这些权重通过异或操作的结果为 0。如果异或的总和不为 0,则无法找到满足 A 要求的苹果分配方案。

  • 假设有 n 个苹果,每个苹果的重量为 w1, w2, ..., wn。A 希望 w1 ^ w2 ^ ... ^ wn = 0
  • 如果这个异或总和不为 0,意味着无论怎么分配苹果,总是无法在不进位的情况下让 A 的计算规则满足。

3. 为什么 XOR 和不为 0 说明无法满足 A 的要求

当所有苹果的异或总和不为 0 时,表示这些数之间在二进制的某些位上不平衡,A 希望的“无进位加法”无法达成。

例如,考虑苹果权重为 w1 = 3w2 = 5

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

华为OD机试题库题解2024 文章被收录于专栏

华为OD机考(CDE卷)题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答。

全部评论

相关推荐

10-28 15:58
已编辑
河海大学 C++
背景:有acm经历,已保研,想找点事情做,可以学点东西赚点钱。官网上看到这个岗位挺对口的,就投了。2024.10.22投简历。10.23打电话让我准备下面试,是代码面,现场写代码。好高的效率,一天就打电话了。10.24下午面试开始。面试前还在准备八股啥的,背不进去emmm,很紧张。开始先是自我介绍,然后很快就进入了写代码环节。先是出了一道题,用二分很简单就写完了,没有OJ测评,面试官看了看觉得没问题就过了。然后是出了两道题二选一。第一个是构造,第二个是数据结构,选的第二道,用并查集写了稍微调一下,面试官感觉没啥问题就让我看看那个构造题。估计是面试总时间要求一个小时,这时候已经30多分钟了,所以面试官让我大概讲了下思路不用写代码,就过了。貌似是个欧拉回路问题。剩下20分钟拷打简历内容,问了简历上有关导航部分我的工作,然后深挖了一下,好在答出来了。剩下就是聊天,面试官南大毕业,也是打过ACM,很强,加了个微信。晚上就接到电话第二天要二面。效率真高。10.25二面貌似是主管。自我介绍完后简单交流了几句。感觉很牛技术很强。然后是出题,不写代码,要大概讲思路。很紧张,回答有点崩,物理上的汗流浃背。好在面试官人很好,不断给提示,最后感觉是勉勉强强答了出来,总体上答得很不好。最后也是闲聊了几句,就结束了。结束后以为没戏了,就打算再接着投一投别的公司类似岗位,但发现基本都要求硕士emmm,就转战开发岗了。10.28进了。小米效率真的高,别的公司还没收到面试通知,这个直接走完流程了。地点北京,后续有空接着写。
点赞 评论 收藏
分享
4 1 评论
分享
牛客网
牛客企业服务