POJ2018 最大平均值问题

该博客探讨如何解决一个数组中长度大于等于K的连续子数组,以获得最大平均值的问题。博主通过斜率优化的方法,将问题转化为寻找最大斜率的连续子数组。利用前缀和和单调队列,博主解释了如何维护斜率递增的曲线,并通过二分查找找到最优切线,最终实现O(1)的均摊时间复杂度。博客内容还提及了之前对斜率优化的理解和应用,以及在不同在线判题系统上的运行情况。
摘要由CSDN通过智能技术生成

题意:给定一个长度为N的数组,求其中长度大于等于K的连续的一段,使其算数平均值最大。输出最大平均值*1000取整的结果。

斜率斜率斜率。。大致感觉可以用斜率来做。。我试了试把最优决策的选择化成斜率的式子,但发现这本来就是斜率的式子,于是就不知道怎么弄了。。何老师讲的类似分数规划的方法来做。。但是我觉得斜率也应该可行,就上黑板去楚了三个点点,大致说清楚了上凸包的中间的一个点对于最后的答案不会有任何贡献。。然后何老师就让我下来写一下。。

正儿八经的题解:处理成前缀和,然后将下标作为x轴,前缀和作为y轴,两个下标之间的平均值就对应了这两个点之间的斜率,求最大的斜率即可。在草稿纸上画三个形成上凸包的点,两两之间连线,把平面分成三个区域,每个区域中的点的最大斜率的决策点要么是这三个点中最左边的,要么是最右边的,也就是说在上凸包上的点永远不可能有贡献。

那么按照斜率优化的做法,单调队列维护一下就行了。单调队列保存好的就是一个斜率递增的曲线,找到这个曲线和新加入的点的切线斜率即是最优值。每相邻两个点之间的斜率减去到新加入的点的斜率的值是递增的,最接近零的就是切线了,所以可以二分查找。实际过程中发现这个切点永远会比上一次的切点靠右,于是对对首进行单调操作即可均摊O(1)实现。

上学期和暑假做了一些斜率优化的题,都是按照模式进行的,没怎么真正理解。这次碰到斜率优化的鼻祖题,感觉那些比较复杂的操作模式反而不好针对这个太原始的题了&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值