题目描述:
记得上学那会, Fbs同学经常会欺负萝卜同学。有一次,他出了这么一道题目,想为难一下萝卜同学。题目是这样的: 有N个整数X_i, X_i值的范围从0到1000000000。要从中选出C个数( 2<=C<=N),使得任意两个数差的绝对值的最小值尽可能大,求这个最大值。 由于数据太大, 这次萝卜同学的确被难住了,怎么办呢,请你来帮帮萝卜同学吧!
输入格式:
第一行是N和C。
接下来的N行,每行一个整数。
输出格式:
一个整数,表示两两最小差距的最大值。
样例输入:
5 3
1
2
8
4
9
样例输出:
3
提示:
【样例解释】
选择1、 4和8或者选择1、 4和9。
【数据说明】
对于 30%的数据: 2<=N<=100;
对于 60%的数据: 2<=N<=1000;
对于 100%的数据: 2<=N<=100000, 2<=C<=N, 0<=X_i<=1000000000。
时间限制: 1000ms
空间限制: 128MB
代码如下:
#include<cstdio>
#include<algorithm>
const int N=1e9;
using namespace std;
int a[100001]={},n,c;
int fun(int mid){
int x=1,s=1;
for(int i=2;i<=n;i++)
if(a[i]-a[x]>mid){
s++;
x=i;
}
return s;
}
int main(){
scanf("%d %d",&n,&c);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int l=0,r=N,mid;
sort(a+1,a+n+1);
while(l<=r){
mid=(l+r)/2;
int s1=fun(mid);
if(s1>=c) l=mid+1;
else r=mid-1;
}
printf("%d",l);
}