改了半天,第三点一直TLE。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e5 + 9;
int n,a[MAXN],T,m,h[MAXN];
bool check(int x){
memset(h,0,sizeof(h));
int num = m;
for(int i = 1;i <= n;i++){
if(h[i] < x){
int t = (x - h[i] - 1) / a[i] + 1;
h[i] += t * a[i];
h[i + 1] += (t - 1) * a[i + 1];
num -= (t << 1);num++;
}
else{
if(i == n) return true;
num--;
}
if(num < 0) return false;
}
return num >= 0;
}
void solve(){
scanf("%lld%lld",&n,&m);
for(int i = 1;i <= n;i++)
scanf("%lld",&a[i]);
int l = 0,r = 0x3f3f3f3f3f3f3f,ans = 0;
while(l < r){
int mid = (l + r) >> 1;
if(check(mid + 1)){
l = mid + 1;
ans = mid + 1;
}
else r = mid;
}
printf("%lld\n",ans);
}
signed main(){
scanf("%lld",&T);
while(T--)
solve();
return 0;
}