POJ1328(贪心)

题目大意:x轴为河岸,给出小岛坐标,在河岸上建探测范围一定雷达,要求覆盖所有小岛,求雷达的最小个数。

分析:以小岛为圆心,探测半径画圆,与x轴交于ai,bi,求出所有区间并排序,如果两个区间有重叠,则可覆盖,将bi更新为b(i-1)即可。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct xy
{
	int x;
	int y;
}point[1000];
struct l
{
	double begin;
	double end;
}length[1005];
int cmp(l a, l b)
{
	return a.begin < b.begin;
}
int main()
{
	int n, k,num=0;
	while (scanf("%d%d", &n, &k) != EOF&&n&&k)
	{
		int sum = 1,flag=0;
		for (int i = 0; i < n; i++)
		{
			scanf("%d%d", &point[i].x, &point[i].y);
		}
		for (int i = 0; i < n; i++)
		{
			if (k < abs(point[i].y))
			{
				flag = 1;
				break;
			}
			double t = sqrt(k*k*1.0- point[i].y*point[i].y*1.0);
			length[i].begin = point[i].x *1.0- t;
			length[i].end = point[i].x*1.0 + t;
		}
		if (flag == 1)
		{
			printf("Case %d: -1
", ++num);
			continue;
		}
		sort(length, length + n, cmp);
		for (int i = 0; i < n - 1; i++)
		{
			if (length[i].end >= length[i + 1].begin)
			{
				length[i + 1].end = length[i].end;
				continue;
			}
			sum++;
		}
		num++;
		printf("Case %d: %d
", num,sum);
	}
	return 0;
}


原文地址:https://www.cnblogs.com/nickqiao/p/7583417.html