华为OD机考算法题:分积木

news/2024/10/9 11:29:44/

目录

题目部分

解读与分析

代码实现


题目部分

题目分积木
难度
题目说明Solo和koko是两兄弟,妈妈给了他们一大堆积木,每块积木上都有自己的重量。现在他们想要将这些积木分成两堆。哥哥Solo负责分配,弟弟koko要求两个人获得的积木总重量“相等”(根据Koko的逻辑),个数可以不同,不然就会哭,但koko只会先将两个数转成二进制再进行加法,而且总会忘记进位(每个进位都忘记)。如当25(11101)加11(1011)时,koko得到的计算结果是18(10010):
   11001
+ 01011
-------------   
   10010
Solo想要尽可能使自己得到的积木总重量最大,且不让koko哭。
输入描述3
3 5 6
第一行是一个整数N( 2≤ N ≤100 ),表示有多少块积木;第二行为空格分开的N个整数Ci(1 ≤ Ci ≤10^{6}),表示第i块积木的重量。
输出描述11
让koko不哭,输出Solo所能获得积木的最大总重量;否则输出“-1”。
补充说明如果能让koko不哭,输出Solo所能获得的积木的总重量,否则输出-1。
该样例输出为 11 。
解释:Solo 能获得重量为 5 和 6 的两块积木,5 转换成二进制是 101, 6 的二进制是 110,按照 kolo 的计算方法(忘记进位),结果为 3(二进制 011)。kolo 获得重量为 3 的积木,而 solo 获得重量为 11(十进制,5 + 6)的积木。
------------------------------------------------------
示例
示例1
输入3
输出3 5 6
说明11


解读与分析

题目解读

此题要求从一堆数字中,把它们分成 2 份,按照加法不进位的方式,使这两份之和“相等”。在“相等”的前提下,输出实际总和较大的那个数字。
如果任何分法都不能保证“相等”,则输出 -1。

分析与思路

做加法不进位,0 + 0 = 0, 0 + 1 = 1, 1 + 1 = 0。实际上,这就是数字异或(XOR)。

原题中,要求按照异或的方式分成两“等份”,那这两等分异或之后,最终的结果为 0。由于异或的结果与顺序无关,即这一堆数字无论怎么改变顺序,最后异或的结果一定是 0 。既然要求两份中其中一份的数字最大,可以把最小的数字作为一份,其他所有的数字作为一份。最终所有数字之和减去最小的数字,即为输出结果。

如果所有数字的异或结果不为 0,则输出 -1。

那我们的思路就变得很简单了,申明 3 个变量:
1. xorValue,整形数字,初始值为0,记录所有数字的异或值。
2. sum,整形数字,初始值为0,记录所有数字之和。
3. minValue,整形数字,初始值为整形数字的最大值,记录所有数字中的最小值。

遍历所有的数字(设当前正在遍历的数字为 curValue),进行如下操作:
1. 把 xorValue 与 curValue 异或,把结果赋值给 xorValue;
2. 把 curValue 的值加到 sum中;
3. 判断 curValue 与 minValue 的大小,如果 curValue 更小,把它赋值给 minValue。
遍历完所有数字后,如果:
 
·  xorValue 不等于 0 ,输出 -1。
 ·  xorValue 等于 0,输出 ( sum - minValue )。

此题只需要遍历一次数字,使用了 3 个整形变量,时间复杂度为 O(n),空间复杂度为 O(1)。


代码实现

Java代码

import java.util.Scanner;/*** 分积木* @since 2023.09.14* @version 0.1* @author Frank**/
public class BlockDivision {public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {String input = sc.nextLine();int count = Integer.parseInt( input );input = sc.nextLine();String[] numbers = input.split( " " );// 此处 count == numbers.count,可以完全不用考虑 count.processBlockDivision( numbers );}}private static void processBlockDivision( String numbers[] ){int xorValue = 0;int sum = 0;int minValue = Integer.MAX_VALUE;for( int i = 0; i < numbers.length; i ++ ){int curValue = Integer.parseInt( numbers[i] );xorValue ^= curValue;sum += curValue;if( curValue < minValue ){minValue = curValue;}}if( xorValue != 0 ){System.out.println( -1 );}else{System.out.println( sum - minValue );}}}

JavaScript代码

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void async function() {while (line = await readline()) {// count 可以忽略var count = parseInt(line);line = await readline();var numberArr = line.split(" ");processBlockDivision(numberArr);}
}();function processBlockDivision( numbers ) {var xorValue = 0;var sum = 0;var minValue = Number.MAX_VALUE;for (var i = 0; i < numbers.length; i++) {var curValue = parseInt(numbers[i]);xorValue ^= curValue;sum += curValue;if (curValue < minValue) {minValue = curValue;}}if (xorValue != 0) {console.log(-1);} else {console.log(sum - minValue);}
}

(完)


http://www.ppmy.cn/news/1122760.html

相关文章

两种常见矩形框旋转方法推导及其C++实现

在已知矩形中心点、长宽和旋转角度&#xff08;定义为矩形最长边与X轴正方向的夹角&#xff09;&#xff0c;如何确定矩形四个顶点的坐标&#xff0c;通常有以下两种处理方法。 法一&#xff1a;直接对顶点进行旋转 比如下图虚线框矩形是实线框矩形绕矩形中心点旋转后得到。在…

提升群辉AudioStation音乐体验,实现公网音乐播放

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是本教程使用环境&#xff1a;1 群晖系统安装audiostation套件2 下载移动端app3 内网穿透&#xff0c;映射至公网 很多老铁想在上班路上听点喜欢的歌或者相声解解闷儿&#xff0c;于是打开手…

【List篇】LinkedList 详解

目录 成员变量属性构造方法add(), 插入节点方法remove(), 删除元素方法set(), 修改节点元素方法get(), 取元素方法ArrayList 与 LinkedList的区别Java中的LinkedList是一种实现了List接口的 双向链表数据结构。链表是由一系列 节点(Node)组成的,每个节点包含了指向 上一个…

云上亚运:所使用的高新技术,你知道吗?

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆云计算学堂 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 前言 一.什么是云上亚运会 二.为什么要使用云…

remote: The project you were looking for could not be found

git拉取公司项目时报错&#xff1a; remote: The project you were looking for could not be found 发生这个问题的原因&#xff0c;在于git账号可能并未真正登录。 我们可以通过打开电脑的凭据管理器&#xff0c;查看git当前的登录是否正常。 参考链接&#xff1a;参考

python经典百题之删除指定字母

题目&#xff1a;删除一个字符串中的指定字母&#xff0c;如&#xff1a;字符串 “aca”&#xff0c;删除其中的 a 字母 程序分析 我们需要编写一个程序&#xff0c;删除字符串中的指定字母。给定一个字符串和要删除的字母&#xff0c;我们需要将字符串中的指定字母全部删除。…

C语言数组和指针笔试题(四)(一定要看)

目录 二维数组例题一例题二例题三例题四例题五例题六例题七例题八例题九例题十例题十一 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412;个人主页 &#x1f978;&#x1f978;&#x1f978;C语言 &#x1f43f;️…

flarum 论坛 User Statistics插件修改

此插件在中国使用日期不是很理想&#xff0c;于是决定修改代码 下面是插件信息&#xff1a; User Statistics A Flarum extension. Add some user statistics in flarum posts, this extension require clarkwinkelmann/flarum-ext-likes-received and will be installed au…