题目描述
陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢?
输入输出格式
输入格式:
第一行,两个整数,A,B。(B<=A<=100000)
第二行,A个整数,分别为这A个瓶盖坐标。
输出格式:
仅一个整数,为所求答案。
输入输出样例
输入样例#1
5 3
1 2 3 4 5
输出样例#1
2
思路
二分+贪心。
定义变量ans,储存当前优解。定义区间[left, right]
,代表程序当前正在此区间内寻找答案(寻找可能比ans更优的解)
当二分查找完毕后,此时ans也是最优解了。
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int n,m,k,i,a[100001];
bool judge(int x)
{
int cnt=1,dis=1;
for(int i=2;i<=n;i++)
if(a[i]-a[dis]>=x)
{
cnt++;
dis=i;
}
return cnt>=m;
}
void search(int n,int m)
{
int left(0),right,ans(0);
left=n;
right=m;
while(left<right)
{
int mid=(left + right) / 2;
if(judge(mid))
{
left=mid+1;
ans=max(ans,mid);
}
else
right=mid;
}
cout<<ans<<endl;
}
int main()
{
ios::sync_with_stdio(false);
cin>>n>>m;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1);
int l=1e8,r;
r=a[n]-a[1];
for(i=2;i<=n;i++)
{
l=min(l,a[i]-a[i-1]);
}
search(l,r);
return 0;
}