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;

}


 

 

你可能感兴趣的:(Install)