POJ 1328
2016-08-25 19:42
323 查看
题意:假设海岸线是一条无限延伸的直线。陆地在海岸线的一侧,而海洋在另一侧。每一个小的岛屿是海洋上的一个点。雷达坐落于海岸线上,只能覆盖d距离,所以如果小岛能够被覆盖到的话,它们之间的距离最多为d。题目要求计算出能够覆盖给出的所有岛屿的最少雷达数目。
在岛屿纵坐标小于0或者岛屿纵坐标距离海岸线大于雷达覆盖距离,或者雷达覆盖距离小于等于0,这三种情况下应该直接输出-1;
其他的情况,应该就是正常情况,进入计算最小雷达数目。
如上图,红色的点为岛屿,那么能够覆盖到此岛屿的雷达所在的区间,应该就是以该岛屿为圆心的圆与x轴交点所在的区间。
这样,我们就可以计算出所有岛屿的雷达所在的区间,得到一个区间数组。
我们将这个数组按照区间左部分进行排序,那么重叠部分就表明这些岛屿的雷达可以共用一个。从而计算出最终解。
在岛屿纵坐标小于0或者岛屿纵坐标距离海岸线大于雷达覆盖距离,或者雷达覆盖距离小于等于0,这三种情况下应该直接输出-1;
其他的情况,应该就是正常情况,进入计算最小雷达数目。
如上图,红色的点为岛屿,那么能够覆盖到此岛屿的雷达所在的区间,应该就是以该岛屿为圆心的圆与x轴交点所在的区间。
这样,我们就可以计算出所有岛屿的雷达所在的区间,得到一个区间数组。
我们将这个数组按照区间左部分进行排序,那么重叠部分就表明这些岛屿的雷达可以共用一个。从而计算出最终解。
#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; struct Node { double l,r; }arr[1123]; int cmp(struct Node a,struct Node b) { return a.l<b.l; } int main() { int n,m; int x=1; while(~scanf("%d%d",&n,&m) && (m+n)) { int a,b; int flag=0; for(int i=0;i<n;i++) { scanf("%d%d",&a,&b); arr[i].l=a-sqrt(m*m-b*b); arr[i].r=a+sqrt(m*m-b*b); if(b>m || m<=0 || b<0) flag=1; } if(flag) { printf("Case %d: -1\n",x++); continue; } sort(arr,arr+n,cmp); double xxx=arr[0].r; int count=1; for(int i=1;i<n;i++) { if(arr[i].l>xxx) { count++; xxx=arr[i].r; } else if(arr[i].r<xxx) xxx=arr[i].r; } printf("Case %d: %d\n",x++,count); } return 0; }
相关文章推荐
- poj 1328 Radar Installation【贪心】【刷题计划】
- poj 1328 Radar Installation
- POJ1328--Radar Installation(贪心)
- poj 1328 Radar Installation
- Radar Installation - POJ 1328 贪心
- POJ 1328 Radar Installation【贪心 区间问题】
- poj-1328-Radar Installation
- POJ 1328 Radar Installation 区间贪心
- poj 1328 Radar Installatio【贪心】
- poj 1328 Radar Installation 【贪心】
- POJ 1328 Radar Installation (贪心,区间选点问题)
- poj1328
- poj 1328 贪心
- POJ 1328(贪心)
- POJ 1328 Radar Installation
- Radar Installation POJ - 1328 (区间选点问题)
- POJ_1328_Radar Installation(greedy)
- poj 1328 Radar Installation
- POJ 1328 南阳oj 287 Radar【区间选点问题】
- Poj 1328 / OpenJudge 1328 Radar Installation