码蹄集丨切蛋糕

题目来源:码蹄集

在这里插入图片描述
在这里插入图片描述

B站老师思路讲解:https://www.bilibili.com/video/BV1fY4y1C7ed/?t=1315.0&vd_source=3ae2a916df1bc5c1114c2bf3e95a2118

C++代码实现:

参考链接:https://blog.51cto.com/u_15745546/5950627

#include<bits/stdc++.h>
using namespace std;
int sum[500100];
int a[500100];
struct Node{
  int post,date;
}sta[500100];
int main(){
  int n,m;
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n;i++){
    scanf("%d",&a[i]);
    sum[i]=sum[i-1]+a[i];//前缀和
  }
  int ans=0;
  int head=0;
  int M=-1e9;//可能有负数,设为负值 
  for(int i=1;i<=n;i++){
    while(head<=ans&&sta[ans].date>=sum[i]){
      ans--;//出队 
    }
    sta[++ans].date=sum[i];//入队 
    sta[ans].post=i;
    while(head<=ans){
      if(sta[head].post>=i-m&&sta[head].post<=i){
        M=max(M,sum[i]-sta[head].date);
        break;
      }
      else{
        head++;
      }
    }
  }
  printf("%d\n",M);
  return 0;
}

Python代码实现:

n, m = map(int, input().split())
a = [0] + list(map(int, input().split()))  # 添加前导0,使得a的下标从1开始
sum_ = [0] * (n+1)
for i in range(1, n+1):
    sum_[i] = sum_[i-1] + a[i]  # 计算前缀和

ans = 0
head = 0
M = -1e9  # 可能有负数,设为负值
sta = [(0, 0)] * (n+1)  # 初始化栈,(post, date)
for i in range(1, n+1):
    while head <= ans and sta[ans][1] >= sum_[i]:
        ans -= 1  # 出队
    ans += 1
    sta[ans] = (i, sum_[i])  # 入队
    while head <= ans:
        if sta[head][0] >= i-m and sta[head][0] <= i:
            M = max(M, sum_[i]-sta[head][1])
            break
        else:
            head += 1

print(M)

提交测试结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Magneto_万磁王

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

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

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

打赏作者

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

抵扣说明:

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

余额充值