#include<iostream>
#include<stdio.h>
using namespace std;
int mx,last,s,n,k;
int const N=100000+5;
int step=0;
int b[N],c[N];
int l,r;
int main()
{
cin>>s>>n>>k;
for(int i=1;i<=n;i++)
{
scanf("%d",&b[i]);
c[i-1]=b[i]-b[i-1];
mx=max(mx,c[i-1]);
}
l=0;
r=mx;
while(1)
{
int ans=0;
int m=(l+r)/2;
for(int i=1;i<=n-1;i++)
{
ans+=c[i]/m;
if(c[i]%m==0)ans--;
}
if(ans>k)
{
l=m+1;
}
if(ans==k)
{
last=m;
if(r-l+1<2)break;
r=m;
}
if(ans<k)
{
r=m;
}
}
cout<<last;
return 0;
}
经过自己测试,(通过代码中那个注释掉的step)
99999 2 1二分了18次
100000000 2 1二分了27次,非常合理且完美
但是经过测试,对于洛谷给的样例我的二分至少运行了一百次。前五个样例正确,后五个全部超时。
自己检查没有发现问题,受不了,求助洛友TAT