首页 > 编程语言 >挑战程序设计竞赛 2.2 poj 1328 Radarinstallation

挑战程序设计竞赛 2.2 poj 1328 Radarinstallation

时间:2023-10-03 10:55:23浏览次数:65  
标签:int double 1328 currl poj Radarinstallation currr nodes

https://vjudge.net/problem/POJ-1328

假设海岸线是一条无限长的直线。陆地在海岸线的一边,海洋在另一边。每个小岛都是位于海边的一个点。
而位于海岸线上的任何雷达装置都只能覆盖 d 的距离,因此,如果两者之间的距离最多为 d,那么海中的一个小岛就可以被一个半径为 d 的装置覆盖。

我们使用直角坐标系,将海岸线定义为 x 轴。海面在 x 轴上方,陆地在 x 轴下方。
给定每个岛屿在海中的位置,并给定雷达装置的覆盖距离,你的任务是编写一个程序,找出覆盖所有岛屿的最小雷达装置数量。
请注意,岛屿的位置由其 x-y 坐标表示。

输入包括几个测试用例。每个案例的第一行包含两个整数 n(1<=n<=1000)和 d,其中 n 是海中岛屿的数量,d 是雷达装置的覆盖距离。
随后是 n 行,每行包含两个整数,分别代表每个岛屿的位置坐标。然后用一行空行来分隔情况。

输入以一行包含一对 0 的行结束

每个测试用例输出一行,包括测试用例编号,以及所需的最少雷达安装数量。"-1 "表示该案例没有解决方案。

3 2
1 2
-3 1
2 1

1 2
0 2

0 0


Case 1: 2
Case 2: 1

通过岛屿圆的半径将半径问题转化为线段贪心问题


#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;
//https://vjudge.net/problem/POJ-1328 

int n, d;
const int N = 1010;
int t = 1;
struct Node {
	double l, r;
}nodes[N];

bool cmp(const struct Node& a, const struct Node& b) {
	if (a.l > b.l) return true;

	return false;
}

void solve() {
	sort(nodes,nodes+n,cmp);
	int ans = 0; double currl = -99999999; double currr = -99999999;
	for (int i = 0; i < n; i++) {
		if (nodes[i].l > currr || nodes[i].r < currl) {
			ans++;  currl = nodes[i].l; currr = nodes[i].r;
		}
		else {
			currl = max(currl, nodes[i].l);
			currr = min(currr, nodes[i].r);
		}
	}
	cout << "Case " << t++ << ": " <<ans << endl;
}


int main()
{
	while (cin >> n >> d) {
		if (n == 0 && d == 0) break;
		int flag = 1;
		for (int i = 0; i < n; i++) {
			int x, y; cin >> x >> y;
			if (y < 0) continue;
			if (d < y) flag = 0;
			double l = x - (double)sqrt((double)d * d - y * y);
			double r = x + (double)sqrt((double)d * d - y * y);
			nodes[i].l = l; nodes[i].r = r;
		}
		if (flag == 0) {
			cout << "Case " << t++ << ": " << -1 << endl; continue;
		}

		solve();
	}


	return 0;
}

视频空间题解

标签:int,double,1328,currl,poj,Radarinstallation,currr,nodes
From: https://www.cnblogs.com/itdef/p/17740886.html

相关文章

  • 挑战程序设计竞赛 2.1章习题 POJ 2386 Lake Counting
    https://vjudge.net/problem/POJ-2386由于最近的降雨,水在农夫约翰的田地上聚集,在这片田地中,每个方块都被表示为一个NxM(1≤N≤100;1≤M≤100)的矩形。每个方块可以是水('W')或干地('.')。农夫约翰想弄清楚他的田地上形成了多少个池塘。池塘是由含有水的相连方块组成的集合,......
  • 挑战程序设计竞赛 2.1章习题 POJ 3009 Curling 2.0
    https://vjudge.net/problem/POJ-3009在MM-21星球上,今年的奥运会之后,冰壶运动开始流行起来。但规则与我们的有些不同。冰壶比赛是在一块冰板上进行的,冰板上标有方形网眼。他们只使用一块石头。游戏的目的是用最少的步数将石头从起点引向终点。图1显示了游戏棋盘的一个示例......
  • 【POJ 3253】Fence Repair 题解(贪心算法+优先队列+哈夫曼树)
    农夫约翰想修理牧场周围的一小段围栏。他测量了围栏,发现他需要N(1≤N≤20000)块木板,每块木板都有一定的整数长度Li(1≤Li≤50000)单位。然后,他购买了一块长度刚好足以锯入N块木板的长木板(即,其长度为Li长度的总和)。FJ忽略了“切口”,即锯切时锯屑损失的额外长度;你也应该忽略它。FJ伤心地......
  • 【POJ 1521】Entropy 题解(贪心算法+优先队列+哈夫曼树)
    熵编码器是一种数据编码方法,通过对删除了“浪费”或“额外”信息的消息进行编码来实现无损数据压缩。换句话说,熵编码去除了最初不需要的信息,以准确编码消息。高度的熵意味着一条消息包含大量浪费的信息;以ASCII编码的英文文本是具有极高熵的消息类型的示例。已经压缩的消息,如JPEG图......
  • [Java]POJO总结
    一、什么是POJO“PlainOldJavaObject”“简单java对象”,也有另外一种英文描述“PlainOrdinaryJavaObject”,都不影响。POJO的内在含义是指那些没有从任何类继承、也没有实现任何接口,更没有被其它框架侵入的java对象。通常POJO类的规范:所有属性应该是私有的所有属性都应......
  • 【POJ 3278】Catch That Cow 题解(广度优先搜索)
    农夫约翰已被告知一头逃亡奶牛的位置,并想立即抓住她。他从一条数字线上的N点(0≤N≤100000)开始,奶牛在同一条数字线上的K点(0≥K≤100000)。农夫约翰有两种交通方式:步行和坐车。*步行:FJ可以在一分钟内从任何点X移动到点X-1或X+1*坐车:FJ可以在一分钟内从任何X点移动到2×X点。如果奶......
  • Strategic game POJ - 1463 树的最小点覆盖,树形dp
    题意:树的最小点覆盖,选择最少的点覆盖所有边。分析:状态:f[u][0/1]表示不选/选编号u的点的最优解转移:不选u,则一定选u的儿子v,即f[u][0]+=f[v][1]选u,则可以选,也可以不选u的儿子v,即f[u][1]+=min(f[v][0],f[v][1]);目标:ans=min(f[rt][0],f[rt][1]);点击查看代码#inc......
  • 【POJ 3278】Catch That Cow 题解(深度优先搜索)
    农夫约翰已被告知一头逃亡奶牛的位置,并想立即抓住她。他从一条数字线上的N点(0≤N≤100000)开始,奶牛在同一条数字线上的K点(0≥K≤100000)。农夫约翰有两种交通方式:步行和坐车。*步行:FJ可以在一分钟内从任何点X移动到点X-1或X+1*坐车:FJ可以在一分钟内从任何X点移动到2×X点。如果奶......
  • Roads in the North POJ - 2631 - 树的直径/树形dp
    题意:给出一棵无向树,求树的直径,即树上两点之间的最长距离分析:两种解法解法1:先任取一个点,找到距离该点最远的点u,再找到距离u最远的点v,那么u和v之间的路径就是一条直径。证明:只要找到了树的直径的一个端点,再从该点找到最远点就一定是直径的另一个端点。所以只需要证明第一次找到的......
  • 【POJ 2488】A Knight‘s Journey 题解(深度优先搜索)
    背景骑士厌倦了一次又一次地看到同样的黑白方块,决定去旅行全世界每当骑士移动时,它是一个方向上的两个正方形和一个垂直于这个方向的正方形。骑士的世界就是他生活的棋盘。我们的骑士生活在一个棋盘上,这个棋盘的面积比普通的8*8棋盘小,但它仍然是矩形的。你能帮助这位冒险的骑士制......