POJ 1328 Radar Installation【贪心】

 2023-09-09 阅读 20 评论 0

摘要:POJ 1328 题意: poj3273?将一条海岸线看成X轴,X轴上面是大海,海上有若干岛屿,给出雷达的覆盖半径和岛屿的位置,要求在海岸线上建雷达,在雷达能够覆盖全部岛屿情况下,求雷达的最少使用量。 分析: 贪心法,先研究一下每

POJ 1328

题意:

poj3273?将一条海岸线看成X轴,X轴上面是大海,海上有若干岛屿,给出雷达的覆盖半径和岛屿的位置,要求在海岸线上建雷达,在雷达能够覆盖全部岛屿情况下,求雷达的最少使用量。

分析:

贪心法,先研究一下每个岛屿,设岛屿到海岸线的垂直距离为d,雷达的覆盖半径为k,若d>k,直接输出-1,若d<=k,则雷达的建造有一个活动区间[x1,x2](用平面几何可以求得出来)。因此,在可以覆盖的情况下每个岛屿都有一个相应的活动区间。该问题也就转变成了最少区间选择问题即:

在n个区间中选择一个区间集合,集合中的各个区间都不相交,集合中元素的个数就是答案了。

#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
using namespace std;struct point
{double left, right;
}p[2010], temp;bool operator < (point a, point b)
{return a.left < b.left;
}int main()
{int n;double r;int kase = 0;while(true){scanf("%d%lf",&n,&r);if(n==0&&r==0)break;bool flag = false;for (int i = 0; i < n; i++){double a, b;scanf("%lf%lf",&a,&b);if (fabs(b) > r){flag = true;}else{p[i].left = a * 1.0 - sqrt(r * r - b * b);p[i].right = a * 1.0 + sqrt(r * r - b * b);}}cout << "Case " << ++kase << ": ";if (flag){cout << -1 << endl;}else{int count = 1;sort(p, p + n);temp = p[0];for (int i = 1; i < n; i++){if (p[i].left > temp.right)//不重叠{count++;temp = p[i];}else if (p[i].right < temp.right)//重叠取里面的端点{temp = p[i];}}cout << count << endl;}}return 0;
}

转载于:https://www.cnblogs.com/demian/p/6557032.html

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/3/21718.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息