二分搜索。 删除的rock越多,那个最小间距越大,极限是L 删除的rock越少,那个最小间距越小,极限是初始的最小间距 而对于边界的确定,确实比较麻烦,我是找了几组数据,找到了共同的特性,证明却不会 #include<iostream> #include<cstdlib> using namespace std; #define inf 1000000005 #define N 50005 int a[N]; int cmp(const void *b,const void *c) { return *(int *)b-*(int *)c; } int bin_search(int l,int r,int n,int m) { int left=l,right=r,mid,last,cnt,i; while(left<=right) { mid=(left+right)/2; last=a[0],cnt=0; for(i=1;i<=n;i++) { if(a[i]-last>=mid) last=a[i]; else cnt++; } if(cnt<=m) left=mid+1; else right=mid-1; } return right; } int main() { int d,n,m,i,l; while(scanf("%d%d%d",&d,&n,&m)!=EOF) { l=inf; a[0]=0,a[n+1]=d; for(i=1;i<=n;i++) { scanf("%d",a+i); if(a[i]-a[i-1]<l) l=a[i]-a[i-1]; } if(a[n+1]-a[n]<l) l=a[n+1]-a[n]; qsort(a+1,n,sizeof(a[1]),cmp); printf("%d/n",bin_search(l,d,n,m)); } return 0; }