题意
有个稻草在不同的位置,还有头奶牛,每头奶牛炸的范围为,求的最小值;
分析
显然的二分答案,对于进行二分,取,取的最大值。至于函数,用来维护已经使用的奶牛个数,再用来记录以爆破的位置。如果当前已爆破的范围小于下一个能触及的范围,则需要一头新的奶牛,如果大于,则可直接返回。否则直到最后都没有大于则满足,更新答案。
代码
#include<bits/stdc++.h> #define ll long long const int N=1e5+5,INF=0x3f3f3f3f,mod=998244353; using namespace std; int n,k; int x[N]; inline int read() { register int x=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar(); return x*f; } bool check(int w) { int sum=0,now=-INF; for(int i=1;i<=n;i++) { if(now<x[i]-w) { sum++; now=x[i]+w; if(sum>k) return false; } } return true; } int main() { n=read();k=read(); for(int i=1;i<=n;i++) x[i]=read(); sort(x+1,x+n+1); int l=0,r=x[n]; while(l<=r) { int mid=l+r>>1; if(check(mid)) r=mid-1; else l=mid+1; } printf("%d",l); return 0; }