跟3273差不多,买一送一。 对可能的长度进行枚举,记录需要去掉的石头数,跟给定的m进行比较,然后二分不断逼近就行了。 #include<iostream> #include<algorithm> using namespace std; int x[50010]; int main() { int n,dis,m,i; int cnt,pre,rec; int left,right,mid; scanf("%d%d%d",&dis,&n,&m); for(i=1;i<=n;i++) scanf("%d",&x[i]); x[n+1]=dis; sort(x+1,x+1+n); left=0; right=dis; while(left<=right) { mid=(left+right)>>1; cnt=0; pre=0; for(i=1;i<=n+1;i++) { if(x[i]-pre>=mid) pre=x[i]; else cnt++; } if(cnt<=m) { left=mid+1; rec=mid; } else right=mid-1; } printf("%d/n",rec); return 0; }