答案是求最小,所以我们可以二分
如何
容易想到,最左边的那个牛肯定要被覆盖,假设他的位置是
那第一个爆炸点选在位置肯定是最优的
所以可以再次进行二分,双二分,没什么好说的
#include <bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
int a[maxn],k,n;
bool isok(int mid)
{
int now=1,s=k;
while( now<=n )
{
int nxt = upper_bound(a+now,a+1+n,a[now]+mid*2)-a;
now = nxt;
s--;
}
return s>=0;
}
int main()
{
cin >> n >> k;
for(int i=1;i<=n;i++) cin >> a[i];
sort(a+1,a+1+n);
int l=0,r=1000000000,mid,ans=0;
while( r>=l )
{
mid = l+r>>1;
if( isok(mid) ) r=mid-1,ans=mid;
else l=mid+1;
}
cout << ans;
}
京公网安备 11010502036488号