有 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; }
标签:int,1603,一本,++,绿色通道,空题,long,include,tt From: https://www.cnblogs.com/towboa/p/16849671.html