很经典的题目。 对于给定的距离len,利用贪心的思想,只需要O(n)的时间就可以判断该len是否满足要求。 因此采用二分测试的方法,时间复杂度是O(n*lg(L))。 #include <algorithm> #include <iostream> using namespace std; int pos[100005],N,C; bool Check(int len) { int sum=1,last=pos[0]; for(int i=1;i<N;i++) { if(pos[i]-last>=len) { sum++; if(sum>=C) return true; last=pos[i]; } } return false; } int main() { scanf("%d%d",&N,&C); for(int i=0;i<N;i++) scanf("%d",&pos[i]); sort(pos,pos+N); int D=1000000000; int Len=0; while(1) { if(D==1) break; D=D%2?(D+1)/2:D/2; if(Check(Len+D)) Len+=D; } printf("%d/n",Len); return 0; }