tips:
1.二分时区间是否要加等号,看等号成立时是否需要进入循环
2.L和R的赋值要看条件,第一个满足条件和最后一个满足条件
3.所有的都可以归结为找位置??
//感觉是二分答案 //想要寻找最后一个满足条件C的元素的位置, //可以寻找第一个满足条件!C的位置,然后将盖位置减一 //left==right 意味着找到唯一位置,相等时不用再进入循环 //ref:算法笔记 #include <cstdio> #include<algorithm> using namespace std; const int M=100010; const double eps=1e-5; int n,c; int a[M]; int judge(int x){ int ans=1; int tmp=a[0]; for(int i=1;i<n;i++){ if(a[i]-tmp>= x){ ans++; tmp=a[i]; } } return ans; } int main(){ while(scanf("%d%d",&n,&c)!=EOF){ for(int i=0;i<n;i++){ scanf("%d",&a[i]); } sort(a,a+n); int L=0; int R=a[n-1]-a[0]; while(L<R){ int mid=L+(R-L)/2; if(judge(mid) < c) R=mid; else L=mid+1; } printf("%d\n",L-1); } return 0; }