贪心算法--雷达安装

题目描述:
假定海岸线是一条无限延伸的直线,陆地在海岸线的一边,大海在另一侧。海中有许多岛屿,每一个小岛我们可以认为是一个点。现在要在海岸线上安装雷达,雷达的覆盖范围是d,也就是说大海中一个小岛能被安装的雷达覆盖,那么它们之间的距离最大为d。
我们使用平面直角坐标系,定义海岸线是x轴,大海在x轴上方,陆地在下方。给你海中每一个岛屿的坐标位置(x,y)和要安装的雷达所覆盖的范围d,你的任务是写一个程序计算出至少安装多少个雷达能将所有的岛屿覆盖。
输入描述:
第一行两个整数n(1≤n≤100000)和d,分别表示海中岛屿的数目和雷达覆盖的范围半径d。
接下来n行,每行两个整数,表示每个岛屿的坐标位置(x,y)。
输出描述:
一行一个整数,即能将所有岛屿全部覆盖至少安装的雷达个数,如果无解则输出“-1”。

样例输入
3 2
1 2
-3 1
2 1

1 2
0 2

0 0
样例输出
Case 1: 2
Case 2: 1

#include<iostream>
#include <math.h>
#include<algorithm>
#include<vector>
using namespace std;
class Nod {
public:
	int x;
	int y;
	bool operator<(const Nod &temp) {
		return this->x < temp.x;
	}
};
Nod N[10000];
int main() {
	int n, d;
	int  x_temp, y_temp;
	while (cin >> n >> d && n && d) {
		for (int i = 0; i < n; i++) {
			cin >> x_temp >> y_temp;
			N[i].x = x_temp;
			N[i].y = y_temp;
		}
		sort(N, n + N);
		int rarda = 1,ctn;//rarda雷达数,ctn用来记录当前雷达距离d最大值时x坐标的值
		ctn = sqrt(d*d - N[0].y*N[0].y) + N[0].x;
		for (int i = 1; i < n; i++) {
			if ((N[i].x - ctn)*(N[i].x - ctn) + N[i].y*N[i].y > d*d) {
				rarda += 1;
				ctn= sqrt(d*d - N[i].y*N[i].y) + N[i].x;
			}
		}
		cout << rarda << endl;
	}
	if (n == 0 || d == 0) {
		cout << 0<< endl;
	}

	system("pause");
}
发布了29 篇原创文章 · 获赞 2 · 访问量 904

猜你喜欢

转载自blog.csdn.net/qq_44954571/article/details/105395114
今日推荐