写这道题是为了记录一下二分的模板,这种求最大中的最小比较适合用二分。
面对这种最大中的最小,有时候会犯晕,到底是最大还是最小。这里的关系是:我们二分中的mid是假设的最大值,如果这个mid成立,那说明他一定是比真正的最小的最大值大的,所以我们往小了找,简而言之,最大是假设的mid的属性,最小是寻找的目标。
#include <iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,c;
int a[100005];
int check(int x){
int i;
int now=1,cnt=1;
for(i=1;i<n;i++){
if(a[i]-now>=x){
cnt++;
now=a[i];
if(cnt==c)return 1;
}
}
return 0;
}
int main()
{
int i;
scanf("%d%d",&n,&c);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
int st=0,en=a[n-1]-a[0],mid;
while(st+1<en){
mid=(st+en)/2;
if(check(mid))st=mid;
else en=mid;
}
if(check(en))printf("%d\n",en);
else printf("%d\n",st);
return 0;
}