Solution-P9889
题目链接
题目描述
有
题目分析
求最小值的最大值的题目大概率都是二分答案。
然而确实是,让我们分析一下如何二分。显然答案具有单调性,若最小植物高度最大值为 LONG_LONG_MAX,当然你设置一些其他的数字也可以。
接下来我们创建一个
代码
在过程中 long long 范围,所以应该在
时间复杂度
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,m,a[114514],b[114514],l,r,mid,ans,u;
bool flag;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>t;
while(t--){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
}
flag=true;
l=0;
r=LONG_LONG_MAX;
while(l<=r){
mid=(l+r)>>1;
ans=u=0;
flag=true;
for(int i=1;i<=n;i++){
b[i]=ceil(1.0*mid/a[i]);
}
for(int i=1;i<=n;i++){
if(b[i]>0){
ans+=i-u-2+(b[i]<<1);
u=i;
b[i+1]-=b[i]-1;
}
if(ans>m){
flag=false;
break;
}
}
flag?l=mid+1:r=mid-1;
}
cout<<l-1<<'\n';
}
return 0;
}