1、B站视频链接:E45 单调队列优化DP 绿色通道_哔哩哔哩_bilibili
cpp
#include <bits/stdc++.h>
using namespace std;
const int N=5e4+10;
int n,tim,w[N],f[N],q[N];
bool check(int m){
int h=1,t=0;
for(int i=1; i<=n; i++){
while(h<=t && f[q[t]]>=f[i-1]) t--;
q[++t]=i-1;
if(q[h]<i-m) h++;
f[i]=f[q[h]]+w[i];
if(i>n-m && f[i]<=tim) return 1;//r指针左移
}
return 0;
}
int main(){
cin>>n>>tim;
for(int i=1;i<=n;i++) cin>>w[i];
int l=-1,r=n+1;
while(l+1<r){
int mid=l+r>>1;
if(check(mid)) r=mid;
else l=mid;
}
cout<<r-1; //空题段长度
}