【2025刷题笔记】- 分积木

刷题笔记合集🔗

分积木

问题描述

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

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

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

输入格式

第一行是一个整数 ,表示有多少块积木。

第二行为空格分开的 个整数 ,表示第 块积木的重量。

输出格式

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

样例输入

3
3 5 6

样例输出

11

数据范围

样例 解释说明
样例1 Solo可以拿走重量为5和6的积木,总重量为11。而koko拿走重量为3的积木。按照koko的计算逻辑,3和11的二进制分别是011和1011,不考虑进位的加法结果为1000,即8。而8与8相等,所以koko不会哭。

题解

这道题的关键在于理解Koko的计算逻辑。仔细分析题目,可以发现Koko的计算方式其实就是二进制的"异或"运算(XOR)。

当我们要判断能否让Koko不哭,实际上是在问:能否将所有积木分成两堆,使得两堆积木的重量在Koko的计算逻辑下相等?

对于异或运算,如果两个相同的数进行异或,结果是0。所以,如果我们想要两堆积木在Koko的逻辑下"重量相等",那么这两堆积木的异或和必须相等,也就是说,所有积木的异或和必须是0。

解题思路如下:

  1. 计算所有积木重量的异或和
  2. 如果异或和为0,说明可以平分(按照Koko的逻辑)
  3. 为了让Solo获得的重量最大,应该给Koko分配最小重量的积木,其余都给Solo

具体实现时:

  1. 对积木按重量排序
  2. 取出最轻的积木,记为min
  3. 计算所有积木的异或和,如果为0,表示可以平分
  4. 如果可以平分,Solo应该拿走除了最轻积木外的所有积木,总重量就是所有积木重量之和减去min

时间复杂度为O(NlogN),主要消耗在排序上。对于给定的数据范围(N≤100),这个复杂度是完全可以接受的。

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()
n = int(input())
w = list(map(int, input().split()))

# 计算积木能否按Koko的逻辑等分
def solve(weights):
    # 排序找出最小值
    weights.sort()
    min_w = weights[0]
    
    # 计算实际总和和Koko逻辑下的和
    real_sum = min_w  # 实际总和
    xor_sum = min_w   # Koko逻辑下的和(异或和)
    
    # 处理剩余积木
    for i in range(1, len(weights)):
        val = weights[i]
        real_sum += val  # 累加实际重量
        xor_sum ^=

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

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

今天 12:55
已编辑
五邑大学 前端工程师
走到这一步,确实有些意外。先简单说说我的情况,我是双非本,大一那年对后端兴趣特别浓,学了快一年半。但不知为什么越往后学兴趣越淡——大概到分布式那块,比如nacos、卡夫卡这些,感觉越来越吃力。再加上看到师兄师姐在后端方向上的碰壁(现在是大go时代),在和师兄师姐商量后我在今年一月左右转前端了或许是因为有java的基础,对项目开发流程有些概念,前端三件套我过得比较快。之后学了Vue,动手做了自己的博客,这大概也是我转前端的一个重要原因吧,一直很想拥有一个属于自己的个人博客,能按自己的想法去设计、实现,并长期迭代完善,这种成就感真的很棒。之前拿过别人的开源项目来更改 但是自己修改的就是一坨,那个时候缺少对前端代码的理解 就算借助ai做出来的效果也是一坨就这样到了大二暑假,我觉得该找份实习,丰富一下简历了。我自认不是很有创造力的人,平时少有自发的项目灵感,所以更希望通过实习开阔眼界、提升能力。一开始投递和面试的过程挺煎熬的,或许是因为目标多是中小厂,很多hr已读不回,或是直接砍半薪资问我接不接受。面试时也常觉得像在走流程,问的都是八股文,有的面试官还会边看题边问,甚至有一次十分钟就结束了,好在最后钛动给了我机会。实习期间我学到了很多,虽然也常被拷打,还好ld会帮我收拾烂摊子。从钛动离职回校后,我半推半就地背八股、学新技术,无聊时就刷里扣、看看牛客和biss。原本以为双非bg很会被hr速度筛掉所以就尝试性的投了纷享销客和百度,没想到最后两家都oc了,雷姆了家人们,双非鼠鼠居然圆了大厂梦yysy,这一路其实冒了不小的风险。毕竟学了那么久的后端,大学四年时间有限,突然转前端,意味着很多积累的知识可能用不上了。但我很庆幸当时有放下的勇气。无论过去做了什么选择,我都想感谢当时的自己,因为那份勇气,才走到了今天。同时也很感谢这一路师兄师姐的帮忙,师兄帮忙模拟面试,提供资料,师姐教我如何选择岗位,如何处理实习带来的问题马上就要北漂了,对未来是充满了期待也存在着恐惧,南方人头一次去这么远的地方,每天都能看到雪,可以跟实力强劲的同事合作,想想都很兴奋,但是也害怕自己不能胜任这份工作会被压力到爆,但是不管怎么样大家一起互勉吧,呆在舒适区只会停滞不前,压力才能带来成长
牛马人的牛马人生:勇敢追梦
2025年终总结
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务