【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;
}
posted @ 2020-04-12 22:54  Jayun  阅读(205)  评论(0编辑  收藏  举报