当前位置: 代码迷 >> 综合 >> POJ1328Radar Installation(贪心,区间)
  详细解决方案

POJ1328Radar Installation(贪心,区间)

热度:16   发布时间:2023-11-08 17:02:02.0

POJ1328

题意:地图的x轴的上方为海,下方为陆地,海中有n个小岛,坐标为(isl[i].x,isl[i].y)。
有一种雷达,能探测到的范围为以d为半径的圆。问海岸线上至少造多少雷达可以把所有的小岛都包含在内。
注意雷达是建在海岸线上的,也就是x轴上的。思路:贪心,从左到右建立雷达,要尽量多地覆盖岛屿。
以岛屿为圆心,以d为半径画圆,如果画出的圆与x轴没有交点,则不能实现。
存在交点的话,计算出第i个岛屿与x轴的交点坐标保存在结构体数组rad[i].starad[i].end中。
对结构体数组排序,按照rad[i].end进行升序排列,然后一次从左到右找雷达。
对于rad[i].end为当前最右边的左坐标,对于下一个岛屿,如果rad[j].sta<ran[i].end,则不需要建立新的雷达,需要更新下一个岛屿。否则需要建立新的雷达。具体代码如下:

不知道为什么PE了。格式应该没问题啊。

贪心+区间:

#include<iostream>
#include<cstdio>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define maxn 1005
struct{int x,y;
}isl[maxn];
struct data{float sta,end;
}rad[maxn];bool cmp(data a,data b){if(a.end <b.end )return true ;else return false;
}int main(){int n,d,t=1;while(cin>>n>>d &&n){int i,j,maxY=0;for( i=0;i<n;i++){cin>>isl[i].x>>isl[i].y;if(isl[i].y>maxY)maxY=isl[i].y;}getchar();getchar();cout<<"Case "<<t++<<":";if(maxY>d || d<0){cout<<-1<<endl;continue;}float len;for(i=0;i<n;i++){len=sqrt(1.0*d*d-isl[i].y*isl[i].y);rad[i].sta=isl[i].x-len;rad[i].end=isl[i].x+len;}sort(rad,rad+n,cmp);int ans=0;bool vis[maxn];memset(vis,false,sizeof(vis));for(i=0;i<n;i++){if(!vis[i]){vis[i]=true;for(j=0;j<n;j++){if(!vis[j]&&rad[j].sta<=rad[i].end)vis[j]=true;}ans++;}}cout<<ans<<endl;}return 0;
}
  相关解决方案