前言:主要是这个题目的答案符合单调性,我们可以二分我们间隔,可以证明间隔越大代价越小,间隔越小代价越大
#include<bits/stdc++.h>
using namespace std;
const int N = (int)5e4+5;
int n,t;
int a[N];
int fun(int x){
vector<int> ans(n+2,0);
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> q;
q.push({0,0});
for(int i=1;i<=n;i++){
while(q.top().second+x+1<i){
q.pop();
}
int p = q.top().first;
ans[i] = p + a[i];
q.push({ans[i],i});
}
int res = 0x3f3f3f3f;
for(int i=n-x;i<=n;i++) res = min(res,ans[i]);
return res;
}
int main(){
cin >> n >> t;
for(int i=1;i<=n;i++) cin >> a[i];
int left = -1, right = n+1;
while(left+1<right){
int mid = (left+right)/2;
int u = fun(mid);
if(u<=t){ // 一开始卡住了,这里如果符合的话我们就需要缩小我们的间隔
right = mid;
}else{
left = mid;
}
}
cout << right;
return 0;
}