【JZOJ 6550】Social Distancing
题目大意:
有 \(n\) 头牛和 \(m\) 个区间,要求每头牛都在区间内且每相邻的牛之间的间隔都不小于 \(d\),求 \(d\) 的最大可能值。
正文:
说到最大化最小值,一般情况下会想到用二分来解决这些问题。二分最关键的是 check
函数,在 check
函数中,我们可以通过枚举牛牛的位置来判断当前二分到的 \(d\) 是否符合题目中的条件:
-
在一个区间内,如果上一头牛可以和本牛的间隔达到 \(d\) 那么这一头牛就在这一区间。
-
在一个区间内,如果上一头牛不能和本牛的间隔达到 \(d\),那么这一头牛就要找一个可以和上一头牛达到 \(d\) 间隔的区间。
如果不符合条件即 \(d\) 不可能是答案。
代码:
inline bool check(int x)
{
int ans = L[1], now = 1;
for (int i = 2; i <= n; i++)
{
if(ans + x <= R[now])
{
ans += x;
}
else
{
while(ans + x > R[now] && now <= m)
++now;
if(ans + x > R[now]) return 0;
if(ans + x <= L[now])
ans = L[now];
else
ans += x;
}
}
return 1;
}