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
题目分析
假设滑行是无限直线。土地位于海岸的一边,海洋在另一边。每个小岛都位于海边。而任何位于海岸线上的雷达装置只能覆盖距离,因此如果距离最远的话,海面上的岛屿可以被半径安装所覆盖。
我们使用笛卡尔坐标系,定义惯性坐标是x轴。海边高于x轴,地面以下。鉴于海上每个岛屿的位置,并给予雷达装置的覆盖距离,您的任务是编写一个程序,以找到覆盖所有岛屿的最少数量的雷达装置。注意,岛的位置由其xy坐标表示。
解题思路
贪心呗
我们可以计算出所有岛屿的雷达所在的区间,得到一个区间数组。
我们将这个数组按照区间左部分进行排序,那么重叠部分就表明这些岛屿的雷达可以共用一个。从而计算出最终解。
源代码
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
const int MAXN=1005;
struct Line
{
double l,r;
}line[MAXN];
bool cmp(Line a,Line b)
{
return a.l<b.l;
}
int main()
{
int n,d;
int i;
int x,y;
bool yes;
int icase=1;
while(cin>>n>>d)
{
yes=true;
int cnt=0;
if(n==0&&d==0)break;
for(i=0;i<n;i++)
{
cin>>x>>y;
if(yes==false)continue;
if(y>d)yes=false;
else
{
line[i].l=(double)x-sqrt((double)d*d-y*y);
line[i].r=(double)x+sqrt((double)d*d-y*y);
}
}
if(yes==false)
{
cout<<"Case "<<icase++<<": -1"<<endl;
continue;
}
sort(line,line+n,cmp);
cnt++;
double now=line[0].r;
for(i=1;i<n;i++)
{
if(line[i].r<now)
now=line[i].r;
else if(now<line[i].l)
{
now=line[i].r;
cnt++;
}
}
cout<<"Case "<<icase++<<": "<<cnt<<endl;
}
return 0;
}