分积木 - 华为OD机试刷题记录

题目描述

Solo和koko是两兄弟,妈妈给了他们一大堆积木,每块积木上都有自己的重量。

现在他们想要将这些积木分成两堆。哥哥Solo负责分配,弟弟koko要求两个人获得的积木总重量“相等”(根据Koko的逻辑),个数可以不同,不然就会哭,但koko只会先将两个数转成二进制再进行加法,而且总会忘记进位(每个进位都忘记)。如当25(11101)加11(01011)时,koko得到的计算结果是18(10010):

 11001
+01011
--------
 10010

Solo想要尽可能使自己得到的积木总重量最大,且不让koko哭。

输入描述

第一行是一个整数N(2≤N≤100),表示有多少块积木;

第二行为空格分开的N个整数Ci(1≤Ci≤10^6),表示第i块积木的重量。

输出描述

如果能让koko不哭,输出Solo所能获得积木的最大总重量;否则输出“NO”。

用例1

输入

3
3 5 6

输出

11

参考题库

华为OD2025A卷目录

实现思路

  • 不进位的加法其实就是 异或计算
  • 按照题目要求最终弟弟和哥哥 分的积木重量的异或和 要想相等,假设为x, 那么所有积木的异或和x ^ x =0,所有积木的异或和必须为 0, 否则输出NO.
  • 另外一个数学定理x ^ 0 = x(交换律),我们的目的是让各个获得最多重要的苹果,所以给弟弟分一个最小重量积木 就行。

实现代码

#include<iostream>
#include<vector>
#include<string>
#include <utility> 
#include <sstream>
#include<algorithm>
#include<list>
#include<queue>
#include<map>
#include<set>
using namespace std;

int main() {
    int n;
    int minValue = 10000009;
    // 记录异或计算结果
    int sum = 0;
    // 记录实际重量和
    int totalWeight = 0;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int tmp;
        cin >> tmp;
        sum ^= tmp;
        minValue = min(minValue, tmp);
        totalWeight += tmp;
    }
    // 不能平分
    if (sum != 0) {
        cout << "NO";
    } else {
        cout << totalWeight - minValue;
    }
    return 0;
}
#华为OD##华为OD2025A卷#
全部评论

相关推荐

我身边的OD同事:&nbsp;&nbsp;&nbsp;&nbsp;我身边陆续入职了7个OD同事,再加上6名华为员工,我们组一直保持十几人规模,工作内容由我统一分配,并不会区别是否是OD员工,关注的更多是能力和工作的匹配度。目前为止,1名OD同事因家庭原因离职,其他6位OD同事,已有4位转为华为员工。OD转华为公司要求:通过公司专业级认证,入职1年,绩效优秀。其实还有一点,部门有华为员工的名额,我们部门名额比较多,所以转的多。与一个武大本科生的聊天:&nbsp;&nbsp;&nbsp;&nbsp;认识了一个武大本科学生,考研二战失败,走了华为OD流程,他给我讲了他来OD的原因:1、他认为,第一份工作去大厂很重要,但是对于他这种没有工作经验的人来说,去其他的大厂比较困难,走华为OD流程是最简单的路;2、他了解OD转华为的流程,有在华为的同学也证实过,他相信自己有能力,1年后转华为;3、更注重工作的实质,不太在乎名声。华为OD的面试流程:1、投递简历。提供姓名、邮箱、手机号、身份证号,用于系统查重录入简历生成简历编号;2、机试。3道算法题,400分满分,150分及格,一般2-3周的准备时间;3、2轮技术面试。主要考察算法+八股+项目;4、HR面和主管面。考察家庭情况、稳定性、职业规划等;5、录用审批,发offer。如果你可以直接参加机试的话,整个流程一般2周左右就完成了。#华为od题库##华为od##华为#
投递华为等公司9个岗位
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务