有 n 道题目要抄,耗时a[i]  。用不超过 t分钟抄这个,每道题要么不写,要么抄完,。

下标连续的一些空题称为一个空题段,它的长度就是所包含的题目数。

现在,小 Y 想知道他在这 t 分钟内写哪些题,才能够尽量减轻马老师的怒火( 连续空题段的最大值 )

 

#include <iostream>
#include <cstring>
using namespace std;
 const int N=2e5+3;
 
 #define int long long
 int a[N],f[N],n,m;
 
 int hh,tt,q[N];
 
 int chk(int md){
     int i;
     for(i=0;i<=n;i++) f[i]=1e9; f[0]=0;
     hh=tt=0;
     for(i=1;i<=n;i++){
         while(hh<=tt&&q[hh]<i-md) hh++;
         f[i]=a[i]+f[q[hh]];
         
         while(hh<=tt&&f[q[tt]]>f[i]) tt--;
         q[++tt]=i;
      }
     return f[n]<=m;
 }
 signed main(){
     int i,l,r,ans;
     cin>>n>>m;
     for(i=1;i<=n;i++) cin>>a[i];
     l=1,r=n;
     a[++n]=0; 
     while(l<=r){
         int md=(l+r)/2; 
         if(chk(md)==0) ans=md,l=md+1; else r=md-1;
     }
     cout<<ans;
 }

 

posted on 2022-11-02 00:13  towboat  阅读(94)  评论(0)    收藏  举报