【JZOJ 6550】Social Distancing

题目大意:

(n) 头牛和 (m) 个区间,要求每头牛都在区间内且每相邻的牛之间的间隔都不小于 (d),求 (d) 的最大可能值。

正文:

说到最大化最小值,一般情况下会想到用二分来解决这些问题。二分最关键的是 check 函数,在 check 函数中,我们可以通过枚举牛牛的位置来判断当前二分到的 (d) 是否符合题目中的条件:

  1. 在一个区间内,如果上一头牛可以和本牛的间隔达到 (d) 那么这一头牛就在这一区间。

  2. 在一个区间内,如果上一头牛不能和本牛的间隔达到 (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;
}
原文地址:https://www.cnblogs.com/GJY-JURUO/p/12688377.html