计蒜客( ICPC Asia HongKong 2017)E
题意:L个位置,选其中S个位置建立基站,使这S个基站之间的距离都尽可能的大,选完S个位置之后,输出两两基站之间的距离中最小的距离。
思路:对距离二分,由题意知,基站之间的距离最小是1,最大是 (最大位置-2),所以直接二分(1~最大位置)即可,也可以直接二分(1~1e6),两两之间距离>=mid的基站对数必须大于等于s-1对,这样才能保证找的s个满足距离>=mid的基站。
代码:
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <sstream>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <stack>
#include <queue>
#include <map>
#include <set>
#define INF 0x3f3f3f3f
#define fori(a,b) for(LL i=a;i<=b;i++)
#define forj(a,b) for(LL j=a;j<=b;j++)
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long LL;
const double PI = acos(-1);
const LL M = 1e5+10;
int l,s,a[M];
int L,R;
void serch()
{
int mid;
L=1,R=a[l];
while(L<=R){
int ans=0,t=1;
mid=(L+R)/2;
for(int i=1;i<=l;i++){
if(a[i]-a[t]>=mid){
t=i;
ans++;
}
}
if(ans>=s-1)
L=mid+1;
else
R=mid-1;
}
return ;
}
int main()
{
while(~scanf("%d%d",&l,&s)&&(l||s)){
for(int i=1;i<=l;i++){
cin >> a[i];
}
sort(a+1,a+1+l);
serch();
cout << L-1 << endl;
}
return 0;
}