POJ 1328 Radar Installation 贪心题解

本题是贪心法题解,不过需要自己观察出规律,这就不容易了,很容易出错。

一般网上做法是找区间的方法。

这里给出一个独特的方法:

1 按照x轴大小排序

2 从最左边的点循环,首先找到最小x轴的圆

3 以这个圆判断可以包括右边的多少个圆,直到不可以包括下一个点,那么继续第2步,画一个新圆。

看代码吧,应该很清晰直观的了。

效率是O(n),虽然有嵌套循环,但是下标没有重复,一遍循环就可以了,故此是O(n)。

#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <float.h>
using namespace std;
const int MAX_N = 1001;
inline float MAX(float a, float b) { return a > b ? a : b; }
inline float MIN(float a, float b) { return a < b ? a : b; }

struct Point
{
	float x, y;
	bool operator<(const Point &p) const
	{
		if (x == p.x) return y > p.y;
		return x < p.x;
	}
	float dist(const Point &p) const
	{
		float a = (x - p.x);
		float b = (y - p.y);
		return sqrtf(a*a+b*b);
	}
	float dist(const float x1, const float y1) const
	{
		float a = (x - x1);
		float b = (y - y1);
		return sqrtf(a*a+b*b);
	}
};

Point ps[MAX_N];

int calRadar(int n, int d)
{
	sort(ps, ps+n);
	float cenX = 0.0f, cenY = 0.0f;
	int ans = 0;
	for (int i = 0; i < n; ) //视情况而增加i
	{
		ans++;
		float dx = sqrtf(float(d*d) - ps[i].y*ps[i].y);
		cenX = ps[i].x + dx;

		for (i++; i < n && ps[i].x <= cenX; i++)
		{
			dx = sqrtf(float(d*d) - ps[i].y*ps[i].y);
			cenX = MIN(cenX, ps[i].x + dx);
		}

		float dis = 0.0f;
		for ( ; i < n; i++)
		{
			dis = ps[i].dist(cenX, cenY);
			if (dis > float(d)) break;
		}
	}
	return ans;
}

int main()
{
	int n, d, t = 1;

	while (scanf("%d %d", &n, &d) && (n || d))
	{
		float maxY = FLT_MIN;//这个放外面了,错误!
		for (int i = 0; i < n; i++)
		{
			scanf("%f %f", &ps[i].x, &ps[i].y);
			maxY = MAX(ps[i].y, maxY);
		}
		if (maxY > (float)d) printf("Case %d: -1\n", t++);
		else printf("Case %d: %d\n", t++, calRadar(n, d));
	}
	return 0;
}

POJ 1328 Radar Installation 贪心题解

时间: 2024-08-24 05:14:58

POJ 1328 Radar Installation 贪心题解的相关文章

Poj 1328 Radar Installation 贪心

题目链接:http://poj.org/problem?id=1328 Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 52768   Accepted: 11867 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the othe

[ACM] POJ 1328 Radar Installation (贪心,区间选点问题)

Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 51131   Accepted: 11481 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point loca

poj 1328 Radar Installation(贪心+快排)

Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, s

POJ 1328 Radar Installation 贪心算法

Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance, s

POJ 1328 Radar Installation 贪心 难度:1

http://poj.org/problem?id=1328 思路: 1.肯定y大于d的情况下答案为-1,其他时候必定有非负整数解 2.x,y同时考虑是较为麻烦的,想办法消掉y,用d^2-y^2获得圆心允许范围,问题转化为在许多圆心允许范围内取尽可能少的点,也即在许多线段上取尽可能少的点,使得所有线段上都有点被取到 3.从左往右考虑,完全在左边的线段肯定要取点,如果这个点在当前线段上已经取了,明显就可以忽略当前线段,明显在线段上的最优点是右端点 1 #include <iostream> 2

POJ 1328 Radar Installation#贪心(坐标几何题)

(- ̄▽ ̄)-* #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> using namespace std; struct node { double l,r; //找到以岛为圆心,以d为半径的圆与坐标x轴的左交点l.右交点r //雷达只有设在l~r之间,岛才在雷达覆盖范围内 }a[1005]; int cmp(node a,node b) { return a.l

POJ 1328 Radar Installation 雷达安装 贪心问题求解

题目链接: POJ 1328 Radar Installation Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coas

[2016-02-04][POJ][1328][Radar Installation]

[2016-02-04][POJ][1328][Radar Installation] Radar Installation Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Submit Status Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in

poj 1328 Radar Installation (贪心)

Radar Installation Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 52823   Accepted: 11883 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point loca