答案是求最小,所以我们可以二分
如何
容易想到,最左边的那个牛肯定要被覆盖,假设他的位置是
那第一个爆炸点选在位置肯定是最优的
所以可以再次进行二分,双二分,没什么好说的
#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; }