【题解】蓝桥杯算法训练 礼物答案注解

博主分享了如何通过二分查找和前缀和解决一个关于取石子的数学问题。问题规定每次必须取连续的2*K个石子,且前后K个石子重量和不超过S。通过不断缩小搜索范围,找到最大可能的K值,从而求得最多能带走的石子数。解题过程中,博主强调了理解check函数和二分查找法的重要性,并表示此题解法经典且简洁,适合复习和提高。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

JiaoShou在爱琳大陆的旅行完毕,即将回家,为了纪念这次旅行,他决定带回一些礼物给好朋友。
  在走出了怪物森林以后,JiaoShou看到了排成一排的N个石子。
  这些石子很漂亮,JiaoShou决定以此为礼物。
  但是这N个石子被施加了一种特殊的魔法。
  如果要取走石子,必须按照以下的规则去取。
  每次必须取连续的2*K个石子,并且满足前K个石子的重量和小于等于S,后K个石子的重量和小于等于S。
  由于时间紧迫,Jiaoshou只能取一次。
  现在JiaoShou找到了聪明的你,问他最多可以带走多少个石子。

本篇是讲解这位博主的解题方法。

一开始是不会做这道题的,看了这位博主的答案才慢慢明白思路。

首先,博主使用的是二分查找前缀和,就是把连续的数组不断分成两部分,在一部分不符合题意时,范围就缩小到另一部分,以此类推…
第二,要理解这篇题解中mid是指每次check的K值,也就是整个长度的一半,在check函数中for循环设置的条件是指1至mid的长度要大于mid+1至N的长度。
第三,在check函数中,当mid值不满足条件时,要从另一边查找。
第四,check函数的意义是从mid值起始,开始检查val[i] - val[i - mid] 和 val[i + mid] - val[i]的值是否都符合题意小于等于S。
第五,通过check函数一旦发现存在符合题意的情况,返回true,把mid值赋给l,重新找mid的值,…直到l和r的值相等退出循环。
第六,因为只有找到符合题意的mid值时才会把mid值赋给l,而mid值不管check返回true还是false,都会改变值,所以l才是最终确定的K值,即总长度的一半。所以,l乘2就是最终答案。

做这道题的时候,经历了读错题→没有思路→发现又读错题→看不懂题解→发现看错题解→不明白思路→明白思路的坎坷解题思路,最终明白了这道题的做法。

这篇题解非常经典简明,但是注解不多,加上本人太菜,所以废了很久时间才做出来,但是收获很多,后续也会以本篇笔记来复习。也希望能帮到后来者有跟我同样经历的人。

如果发现有内容错误处,评论指出,教学相长,感激不尽。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆浆两块钱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值