题目描述
FJ新建了一个有N(2≤N≤100000)个畜栏的畜棚。畜栏的位置分布在直线的点x1,…,xN(0≤xi≤1000000000)上。
他的C(2≤C≤N)只牛不喜欢这个畜棚的设计,并且对在同一个畜栏里的其他牛进行攻击。为了防止牛受到伤害,FJ想把这些牛分配到某些畜栏中,使得这些牛所在的任意两个畜栏之间的最短距离尽可能长。求最长的最短距离是多少。
输入描述
第1行:两个用空格隔开的整数N和C。
第2到N+1行:每行包括一个整数,表示畜栏的位置Xi。
输出描述
一个整数:最长的最短距离。
样例
输入 复制
5 3 1 2 8 4 9
输出 复制
3
提示
样例说明:FJ把3只牛放到位置是1、4和8的畜栏里,最长的最短距离是3。
二分答案,emmm ,二分check中sum不要忘了+1,额,就这样
#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define endl '\n'
#define lowbit(x) ((x)&-(x))
const int N=2e6+10;
typedef long long ll;
ll ans=0,n1,m1;
ll t=0,s1=0,s2=0,s3=0,s4=0,max1=0,max2=0,w,min1=100000000,sum=0,n,m,i,j,k,v,l,r;
inline int read() {
bool sym=0;
int res=0;
char ch=getchar();
while(!isdigit(ch))sym |=(ch =='-'),ch=getchar();
while(isdigit(ch)) res =(res<<3)+(res<<1)+(ch^48),ch=getchar();
return sym ? -res : res;
}
void print(int x) {
if(!x)return;
print(x/10);
putchar(x%10+'0');
}
int isPrime(int n)
{
float n_sqrt;
if(n==1) return 0;
if(n==2 || n==3) return 1;
if(n%6!=1 && n%6!=5) return 0;
n_sqrt=floor(sqrt((float)n));
for(int i=5;i<=n_sqrt;i+=6)
{
if(n%(i)==0 | n%(i+2)==0) return 0;
}
return 1;
}
ll a[1000086];
ll check(ll x){
/*if(x*m>a[n]-a[1])
return 0;*/
ll aa=1;
ll sum=0;
for(ll i=1;i<=n;i++)
{
if(a[i]-a[aa]>=x)
{
sum++;
aa=i;
}
}
//cout<<sum<<endl;
if(sum+1>=m)
return 1;
else
return 0;
}
ll ef(){
ll aa=-1;
l=a[1];
r=a[n];
ll mid;
ll ans=0;
while(l<r){
mid=(l+r+1)>>1;
//cout<<mid<<" ";
if(check(mid))
{
l=mid;
ans=max(ans,l);
}
else
{
//cout<<l<<endl;
r=mid-1;
}
}
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
cout<<ef();
return 0;
}
//mio lover