【2025刷题笔记】- 分苹果

刷题笔记合集🔗

分苹果

问题描述

A、B两个人把苹果分为两堆,A希望按照他的计算规则等分苹果,他的计算规则是按照二进制加法计算,并且不计算进位 12+5=9(1100 + 0101 = 9),B的计算规则是十进制加法,包括正常进位,B希望在满足A的情况下获取苹果重量最多。

输入苹果的数量和每个苹果重量,输出满足A的情况下B获取的苹果总重量。

如果无法满足A的要求,输出-1。

输入格式

第一行是一个整数 ,表示苹果的数量。

第二行是 个空格分隔的整数,表示每个苹果的重量。

输出格式

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

样例输入

3
3 5 6
8
7258 6579 2602 6716 3050 3564 5396 1773

样例输出

11
35165

数据范围

样例 解释说明
样例1 A取重量为3的苹果,B取重量为5和6的苹果,总重量为11。A和B按照二进制不计算进位都得到结果为8,满足A的要求。
样例2 B取重量为7258、6579、6716、3050、5396、1773、2602的苹果,总重量为35165。
  • (总苹果数量)
  • (每个苹果重量)

题解

这道题的核心是理解A的计算规则。当我们仔细分析时,发现A的"不计算进位的二进制加法"实际上就是异或运算(XOR)。

问题可以转化为:将所有苹果分成两组,使得两组苹果的异或和相等,并且B组的普通加法和尽可能大。

为了实现这个目标,我们可以这样思考:

  1. 如果所有苹果的异或和为0,那么把所有苹果都给B是最优的
  2. 如果所有苹果的异或和不为0,那么无法满足A的要求,输出-1
  3. 如果所有苹果的异或和为0,但我们还需要至少给A一个苹果,那么应该给A重量最小的那个苹果

具体算法步骤:

  1. 计算所有苹果重量的异或和
  2. 如果异或和为0,说明可以平分(按照A的计算规则)
  3. 给A分配重量最小的苹果,其余全部给B
  4. 输出B获得的总重量

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

参考代码

  • Python
import sys
input = lambda:sys.stdin.readline().strip()

# 读取输入
n = int(input())
weights = list(map(int, input().split()))

def solve(apples):
    # 按重量排序
    apples.sort()
    
    # 最小重量
    min_w = apples[0]
    
    # 计算异或和
    xor_sum = min_w
    # 计算实际总和
    total = min_w
    
    # 处理剩余苹果
    for i in range(1, len(apples)):
        w = apples[i]
        xor_sum ^= w  # 异或运算
        total += w    # 普通加法
    
    # 判断是否可以满足A的要求
    if xor_sum == 0:
        # 可以满足,B拿走除最轻以外的所有苹果
       

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

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

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

全部评论
我好像也刷过这题
点赞 回复 分享
发布于 今天 20:40 陕西

相关推荐

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

创作者周榜

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