计蒜客 T1878 丢瓶盖
最小值最大,显然二分了。
check()函数判断当前相邻点距离为\(mid\)的情况下能选处多少个点,若选出的点的数量大于等于\(m\)则满足要求,可继续扩大左边界。
注意点
左边界取为\(o\),因为存在所有数均相等的情况,此时的答案为\(0\)。
const int N=1e5+10;
int a[N];
int n,m;
bool check(int mid)
{
int cnt=1,l=a[0];
for(int i=1;i<n;i++)
if(a[i] - l >= mid)
l=a[i],cnt++;
return cnt>=m;
}
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
sort(a,a+n);
int l=0,r=a[n-1]-a[0];
while(l<r)
{
int mid=l+r+1>>1;
if(check(mid))
l=mid;
else
r=mid-1;
}
cout<<l<<endl;
//system("pause");
return 0;
}