跳过正文

poj1328 雷达安装

·502 字·
Archived

雷达安装

poj1328

以岛屿为圆心,雷达范围为半径,计算此圆与x轴交点的线段,以此把所有岛屿的区间计算出来。

因此,这道题就变成了在数轴上选最少的点,覆盖给定线段。

把每条线段以右端点排序,然后进行选择即可。

sqrt函数使用时要保证数据类型一致。

注意输出格式以及Case的C要大写= =

#include "stdafx.h"
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

struct radarRange {
	double left;
	double right;
	bool operator < (const radarRange &x) const //<重载,用于sort函数
	{
		if (right != x.right) return right < x.right;
		return left < x.left;
	}
};

struct islandPosition {
	int x;
	int y;
};

int radar()
{
	int n, d;
	cin >> n >> d;
	if (n == 0 && d == 0)
		return -2;

	islandPosition *p = new islandPosition[n];
	radarRange *r = new radarRange[n];

	for (int i = 0; i < n; i++)
	{
		cin >> p[i].x >> p[i].y;
	}

	if (d == 0)
		return -1;

	for (int i = 0; i < n; i++)
		if (p[i].y > d)
		{
			return -1;
		}

	for (int i = 0; i < n; i++)//计算雷达安装范围
	{
		double tmp = sqrt(double(d *d) - double(p[i].y * p[i].y));
		r[i].left = p[i].x - tmp;
		r[i].right = p[i].x + tmp;
	}

	//for (int i = 0; i < n; i++)//debug
	//{
	//	cout << r[i].left << ' ' << r[i].right << endl;
	//}
	sort(r, r + n);
	//for (int i = 0; i < n; i++)//debug
	//{
	//	cout << r[i].left << ' ' << r[i].right << endl;
	//}
	double start, end;
	int sum = 1;
	start = r[0].left;
	end = r[0].right;
	for (int i = 1; i < n; i++)//计算所需雷达数
	{
		if (r[i].left <= end && r[i].left >= start)
		{
			start = r[i].left;
		}
		/*if (r[i].left <= end && r[i].left < start)
		{
			;
		}*/
		if (r[i].left > end)
		{
			start = r[i].left;
			end = r[i].right;
			sum++;
		}
	}
	delete[] p; delete[] r;
	return sum;
}

int main()
{
	int tmp;
	int sum = 1;
	while (1)
	{
		tmp = radar();
		if (tmp == -2) break;
		cout << "Case " << sum++ << ": " << tmp << endl;
	}

	system("pause");
}

/*
Sample Input

3 2
1 2
-3 1
2 1

1 2
0 2

0 0
Sample Output

Case 1: 2
Case 2: 1
*/
Sakari
作者
Sakari
A little bit about you

相关文章

poj1458 最长公共子序列长度
·141 字
Archived
poj2485 Prim算法
·410 字
Archived