题目描述
陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?
输入输出格式
输入格式:第一行,两个整数,A,B。(B<=A<=100000)
第二行,A个整数,分别为这A个瓶盖坐标。
输出格式:仅一个整数,为所求答案。
输入输出样例
说明
限时3秒
思路:先排序
左边界为l=1,r=f[A]-f[1]
然后二分答案,当前的坐标大于基准事就sum++,同时基准也要变一下。当sum>=B时说明mid较小,否则mid较大
感觉二分的题这些分解把卧的有点难度。尤其时check函数里面的。
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int f[100006];
int A, B;
int Max;
int x;
bool check(int mid)
{
int sum = 1;
int p = 1;
for (int i = 2; i <= A; i++)
if (f[i] - f[p]>=mid)
{ sum++, p = i; }
if (sum >= B)
return true;
else
return false;
}
int main()
{
//freopen("1.txt", "r", stdin);
cin >> A >> B;
for (int i = 1; i <= A; i++)
{
cin >> f[i];
}
sort(f + 1, f + A + 1);
int l = 1, r = f[A] - f[1];
int mid;
while (l <= r)
{
mid = (r + l) / 2;
//cout << mid << endl;
if (check(mid))
l = mid + 1;
else
r = mid - 1;
}
cout << l-1;
return 0;
}