二分。
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int maxn = 50000 + 10; int n,k,l,r,mid,ans,d; int a[maxn]; bool check(int dist) { dist=2*dist; int d=0,sum=1; for(int i=2;i<=n;i++) { if(a[i]-a[i-1]>dist-d) { sum++; d=0; } else d+=a[i]-a[i-1]; } //printf("%d %d ",dist/2,sum); return sum<=k; } int main() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(a+1,a+n+1); l=1;r=a[n]; while(l<r) { mid=(l+r)>>1; if(check(mid)) r=mid; else l=mid+1; } printf("%d ",l); return 0; }