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

news2024/11/25 11:00:14

目录

题目部分

解读与分析

代码实现


题目部分

题目分积木
难度
题目说明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.coloradmin.cn/o/1036666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记一次nginx负载均衡健康检查引起的事故之no live upstreams while connecting to upstream

文章目录 概要一、负载均衡1.1、常用指令解析1.2 负载算法配置1.3、反向代理 二、事故分析三、小结 概要 Nginx是工作中常用的HTTP服务中间件&#xff0c;除了提供HTTP服务&#xff0c;常用的还有反向代理、限流、负载均衡等功能。 负载均衡支持七层负载均衡&#xff08;HTTP&…

KVCache原理简述

在GPT的推理过程中&#xff0c;它根据完整的提问和回答的已生成部分&#xff0c;来生测下一个词&#xff08;的概率&#xff09;。 例如&#xff0c;我们的提问是【天王盖地虎&#xff0c;】&#xff0c;回答是【宝塔镇河妖。】。 那么第一次&#xff0c;GPT根据【天王盖地虎…

Windows安装Docker Desktop并配置镜像、修改内存占用大小

启用Hyper-V Win S 搜索控制面板 安装WSL2 第一种方法&#xff08;推荐&#xff09; 以管理员运行命令提示符&#xff0c;然后重启Docker Desktop wsl --updatewsl --set-default-version 2第2种方法去微软官网下载WSL2并安装 《微软官网下载WSL2》 配置WSL2最大内…

类和对象:运算符重载

本篇文章来介绍一下C中的运算符重载&#xff0c;以及与运算符重载有关的三个默认默认成员函数&#xff1a;赋值运算符重载&#xff0c;普通对象取地址与const对象取地址操作符重载&#xff0c;也就是下面图片中6个默认成员函数的后三个&#xff0c;前三个默认成员函数在之前文章…

Makerbase SimpleFOC MINI 基本测试

第1部分 硬件介绍 1.1 硬件清单 序号品名数量1SimpleFOC MINI V1.0 主板12ARDUINO UNO主板13MKS SF2804电机14杜邦线45DC12V电源16USB 线1 1.2 硬件连接 1.SimpleFOC MINI V1.0 主板主板与Arduino UNO主板叠接。如下图所示&#xff1a; 2.USB 线一端连接 Arduino UNO 主板…

RabbitMQ工作模式——Routing路由模式

1.Routing路由模式 Routing生产者代码 public class Producer_Routing {public static void main(String[] args) throws IOException, TimeoutException {//1.创建连接工厂ConnectionFactory factory new ConnectionFactory();//2.设置参数factory.setHost("172.16.98.…

一文彻底搞懂PN结及其单向导电性(图解说明)

前置知识 首先我们要知道纯净的本征半导体 硅 的导电性是非常差的&#xff0c;所以我们一般都会向纯净硅中添加杂质&#xff0c;也就是P型半导体和N型半导体。P型半导体和N型半导体都是呈电中性的&#xff0c;对于N型半导体而言&#xff0c;它又多数载流子电子和带正电荷的N离子…

【LeetCode-中等题】113. 路径总和 II

文章目录 题目方法一&#xff1a;DFS回溯 题目 方法一&#xff1a;DFS回溯 解题核心 就是要知道递归在哪里结束 &#xff0c;收货结果在哪里收获&#xff0c;哪些变量需要回溯&#xff0c;哪些不需要回溯 class Solution {List<List<Integer>> res new ArrayLis…

BI技巧丨Window应用之累计求和

Window函数除了可以用来计算同环比、移动平均之外&#xff0c;还可以用来处理累计求和问题。 核心在于Window的from和to参数的设定&#xff0c;可以将其设置为绝对位置和相对位置。 先来看看本期的案例数据&#xff1a; 案例数据比较简单&#xff0c;一张销售事实表。 将其导…

C++核心编程——P45-52继承

继承 继承是面向对象三大特性之一 有些类与类之间存在特殊的关系&#xff0c;例如下图中: 我们发现&#xff0c;定义这些类的时候&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。 这时候我们就可以考虑利用继承的技术&#xff0c;减少重复代码量…

PPPoE配置

实验需求 配置IP地址使用PPPOE拨号上网设置路由让直播业务部和营销部都可以访问外网 实验拓扑 实验步骤 配置 R1地址池 电信链路&#xff1a; [Huawei]undo info-center enable Info: Information center is disabled. [Huawei]sysname r1 [r1]ip pool zhibo  //配置…

多进程编程- POSIX命名信号量(named semaphore)

POSIX命名信号量是POSIX标准下的一个进程间同步原语&#xff0c;允许多个进程共享同一个信号量&#xff0c;从而实现进程间的同步和通信。这与无名信号量不同&#xff0c;无名信号量主要用于线程之间的同步&#xff0c;而不是进程之间。 命名信号量是“命名”的&#xff0c;因…

基于AVR128单片机抢答器控制系统

一、系统方案 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 uchar set_time 0 ; DDRA0XFF; PORTA0xff; DDRB0XFF; PORTB0x00; DDRC0X00; PORTC0xff; DDRD0XFc; PORTD0XFF; DDRE0XFF; PORTE0XFF; DDRF0XFF; PORTF0XF0; beer1(); timer1_i…

Linux-多路转接-select/poll

select/poll 五种IO模型对IO的正确理解何为高效的IO阻塞IO非阻塞IO设置文件描述符为非阻塞模式非阻塞IO例子 信号驱动IO异步IO多路转接 selct认识接口select返回值 基本使用select使用特点缺点 poll认识接口对select的改善缺点 五种IO模型 对IO的正确理解 &#x1f680;IO不仅…

MySQL学习笔记9

MySQL数据表中的数据类型&#xff1a; 在考虑数据类型、长度、标度和精度时&#xff0c;一定要仔细地进行短期和长远的规划&#xff0c;另外&#xff0c;公司制度和希望用户用什么方式访问数据也是要考虑的因素。开发人员应该了解数据的本质&#xff0c;以及数据在数据库里是如…

Sentinel故障转移及实现原理

Sentinel故障转移及实现原理 一、哨兵模式的基本工作流程二、判断实例下线三、选举新主库四、哨兵模式弊端五、哨兵集群判断实例下线六、哨兵集群判断实例下线详细工作过程七、哨兵集群的通信八、哨兵和客户端的通信九、总结 一、哨兵模式的基本工作流程 redis在运行时会开启一…

vue基础知识十五:说说你对slot的理解?slot使用场景有哪些?

一、slot是什么 在HTML中 slot 元素 &#xff0c;作为 Web Components 技术套件的一部分&#xff0c;是Web组件内的一个占位符 该占位符可以在后期使用自己的标记语言填充 举个栗子 <template id"element-details-template"><slot name"element-na…

(2022|ECCV,图像分割,VQ-SEG,AR Transformer)Make-A-Scene:利用人类先验进行基于场景的文本到图像生成

Make-A-Scene: Scene-Based Text-to-Image Generation with Human Priors 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2.相关工作 2.1. 图像生成 2.2. 图像标…

2023年汉字小达人区级自由报名明天开赛,3个新问题和往年真题练一练

明天9月25日&#xff0c;备受关注的2023年第十届上海小学生汉字小达人区级自由报名的比赛就要开始了&#xff0c;最近还是有几个“小迷糊”家长刚听说这个活动&#xff0c;问了几个问题&#xff0c;我觉得挺有普遍性的&#xff0c;所以再次给大家回答一下&#xff0c;希望能够帮…

redis漏洞修复:CVE-2022-35977、CVE-2023-22458、CVE-2023-28856

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、漏洞内容二、现状三、更新redis下载镜像停止已有的容器启动新的容器 四、更新后的版本1. 查看日志2. 查看版本 总结 前言 漏扫发现机器上的redis版本有点低…