记得上学那会, Fbs同学经常会欺负萝卜同学。有一次,他出了这么一道题目,想为难一下萝卜同学。题目是这样的: 有N个整数X_i, X_i值的范围从0到1000000000。要从中选出C个数( 2<=C<=N),使得任意两个数差的绝对值的最小值尽可能大,求这个最大值。 由于数据太大, 这次萝卜同学的确被难住了,怎么办呢,请你来帮帮萝卜同学吧!
【输入格式】
第一行是N和C。
接下来的N行,每行一个整数。
【输入格式】
一个整数,表示两两最小差距的最大值。
【输入输出样例】
aggr.in aggr.out
5 3
1
2
8
4
9
3
【输入格式】
第一行是N和C。
接下来的N行,每行一个整数。
【输入格式】
一个整数,表示两两最小差距的最大值。
【输入输出样例】
aggr.in aggr.out
5 3
1
2
8
4
9
3
解题思路:
二分答案。
ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005];
int main()
{
int n,c,i;
scanf("%d%d",&n,&c);
for(i = 1;i <= n;i ++){
scanf("%d",&a[i]);
}
sort(a + 1,a + 1 + n);
ll l = 0,r = 1000000000;
int s1,num;
while(l + 1 < r){
ll mid = (l + r) / 2;
s1 = 1,num = 1;
for(i = 2;i <= n;i ++){
if(a[i] - a[s1] >= mid){
num ++;
s1 = i;
}
}
if(num >= c) l = mid;
else r = mid;
}
printf("%d\n",l);
return 0;
}
using namespace std;
typedef long long ll;
int a[100005];
int main()
{
int n,c,i;
scanf("%d%d",&n,&c);
for(i = 1;i <= n;i ++){
scanf("%d",&a[i]);
}
sort(a + 1,a + 1 + n);
ll l = 0,r = 1000000000;
int s1,num;
while(l + 1 < r){
ll mid = (l + r) / 2;
s1 = 1,num = 1;
for(i = 2;i <= n;i ++){
if(a[i] - a[s1] >= mid){
num ++;
s1 = i;
}
}
if(num >= c) l = mid;
else r = mid;
}
printf("%d\n",l);
return 0;
}
参考stevensonson的博客,链接:http://blog.csdn.net/stevensonson/article/details/77937455