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

问题描述

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就是最终答案。

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

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

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

上一篇:1136 A Delayed Palindrome (20 分) (高精度 回文数)


下一篇:Consider using the `--user` option or check the permissions.