UVA1193 Radar Installation

不妨对于每个需要被监视的点转化为在x轴上可以选择的区间。这样就变成了在n个区间,每个区间需要出现一个点,求最小点数,贪心即可。记录一个last表示最后一个监视器的坐标,按照左端点升序排序,若当前点左端点大于last,则新建一个监视器,last为该区间右端点,否则last为min(last,r)。


const int N = 1e3 + 79;
int x, y, n, d;
struct inter {
	double l, r;
	bool operator <(const inter&rhs)const {
		return l < rhs.l;
	}
} p[N];
int main() {
	int T = 0;
	while(1) {
		read(n);
		read(d);
		if(!n & !d)  break;
		cout << "Case " << ++T << ": ";
		bool flag(0);
		rep(i, 1, n) {
			read(x);
			read(y);
			if(y > d) {
				flag= 1;
				break;
			}
			double c = sqrt(1.0 * d * d - 1.0 * y * y);
			p[i].l = x - c;
			p[i].r = x + c;
		}
		if(flag) {
			out(-1, '
');
			continue;
		}
		std::sort(p + 1, p + n + 1);
		int num(0);
		double last = -1e18;
		rep(i, 1, n) {
			if(p[i].l > last) {
				last = p[i].r;
				++num;
			} else {
				last = min(last, p[i].r);
			}
		}
		out(num, '
');
	}
	return 0;
}

本文来自博客园,作者:{2519},转载请注明原文链接:https://www.cnblogs.com/QQ2519/p/15458566.html

原文地址:https://www.cnblogs.com/QQ2519/p/15458566.html