如题:http://poj.org/problem?id=1328
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 56739 | Accepted: 12802 |
Description
We use Cartesian coordinate system, defining the coasting is the x-axis. The sea side is above x-axis, and the land side below. Given the position of each island in the sea, and given the distance of the coverage of the radar installation, your task is to write a program to find the minimal number of radar installations to cover all the islands. Note that the position of an island is represented by its x-y coordinates.
Figure A Sample Input of Radar Installations
Input
The input is terminated by a line containing pair of zeros
Output
Sample Input
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
Sample Output
Case 1: 2 Case 2: 1
Source
这一题真心让我很无语..题目表达不清,图画的还误导人.WA了我一晚上,2点多才睡 真是醉了
题目大意:X轴是陆地,x轴上面试海面,海面上有小岛,给你半径,要求在x轴上放雷达,最少放几个能覆盖所有海上的小岛?
1.数据全部都是double型。
2.d的范围竟然可以<0......(哪家的雷达半径是负的?..)
思路:以小岛为圆心,d为半径做圆,求在x轴的2个交点,这2个点之间的建立雷达,距离肯定小于等于小岛,这就是雷达可以建立的范围,求出所有。
将这些区间按左端点小->大排序,有重复的区间代表不用建立雷达,没有需要在加一个雷达。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
struct node
{
double x,y;
};
node pos[1005];
int n;
double d;
struct line
{
double l,r;
};
line Line[1005];
int cmp(line &a,line &b)
{
return a.l<b.l;
}
int main()
{
//freopen("C:\\1.txt","r",stdin);
int cnt=0;
while(~scanf("%d%lf",&n,&d)&&(n||d))
{
cnt++;
int flag=0;
memset(pos,0,sizeof(pos));
memset(Line,0,sizeof(Line));
int i;
for(i=0;i<n;i++)
scanf("%lf%lf",&pos[i].x,&pos[i].y);
printf("Case %d: ",cnt);
if(d<0)
{
printf("-1\n");
continue;
}
i=0;
while(i<n)
{
if(pos[i].y>d)
{
flag=1;
break;
}
else
{
Line[i].l=pos[i].x-sqrt(d*d-pos[i].y*pos[i].y);
Line[i].r=sqrt(d*d-pos[i].y*pos[i].y)+pos[i].x;
}
if(Line[i].l>Line[i].r)
{
int t=Line[i].l;
Line[i].l=Line[i].r;
Line[i].r=t;
}
i++;
}
sort(Line,Line+n,cmp);
if(flag)
printf("-1\n");
else
{
int res=1;
line temp=Line[0];
for(i=1;i<n;i++)
{
if(Line[i].l>temp.r)
{
res++;
temp=Line[i];
}
else if(Line[i].r<temp.r)
temp=Line[i];
}
printf("%d\n",res);
}
}
}