UVALive 2519 Radar Installation 雷达扫描 区间选点问题

题意:在坐标轴中给出n个岛屿的坐标,以及雷达的扫描距离,要求在y=0线上放尽量少的雷达能够覆盖全部岛屿。

很明显的区间选点问题。

代码:

/*
*  Author:      illuz <iilluzen[at]gmail.com>
*  Blog:        http://blog.csdn.net/hcbbt
*  File:        l2911.cpp
*  Create Date: 2013-09-09 20:51:05
*  Descripton:   
*/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;

const int MAXN = 1010;
int n, r, cas = 1;

struct Point {
	double lhs, rhs;
} a[MAXN];

bool cmp(Point a, Point b) {
	if (a.rhs != b.rhs)
		return a.rhs < b.rhs;
	return a.lhs > b.lhs;
}

int main() {
	int x, y;
	bool flag;
	while (scanf("%d%d", &n, &r) && (n || r)) {
		flag = true;
		memset(a, 0, sizeof(a));
		for (int i = 0; i < n; i++) {
			scanf("%d%d", &x, &y);
			if (flag) {
				if (y > r) {
					flag = false;
					continue;
				}
				double t = sqrt((double)r * r - y * y);
				a[i].lhs = x - t;
				a[i].rhs = x + t;
			}
		}
		printf("Case %d: ", cas++);
		if (!flag)
			printf("-1\n");
		else {
			sort(a, a + n, cmp);
//			for (int i = 0; i < n; i++)
//				printf("%lf %lf\n", a[i].lhs, a[i].rhs);
			int ans = 1;
			double start = a[0].rhs;
			for (int i = 1; i < n; i++) {
				if (a[i].lhs - start <= 1e-4)
					continue;
				ans++;
				start = a[i].rhs;
			}
			printf("%d\n", ans);
		}
	}
	return 0;
}


你可能感兴趣的:(ACM)