题意
有个稻草在不同的位置,还有
头奶牛,每头奶牛炸的范围为
,求
的最小值;
分析
显然的二分答案,对于进行二分,
取
,
取
的最大值。至于
函数,用
来维护已经使用的奶牛个数,再用
来记录以爆破的位置。如果当前已爆破的范围小于下一个能触及的范围,则需要一头新的奶牛,如果
大于
,则可直接返回
。否则直到最后
都没有大于
则满足,更新答案。
代码
#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;
}

京公网安备 11010502036488号