您的位置:首页 > 其它

POJ Radar Installation (贪心)

2015-07-31 17:36 330 查看

Radar Installation

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other)
Total Submission(s) : 34   Accepted Submission(s) : 15
[align=left]Problem Description[/align]
Assume the coasting is an infinite straight line. Land is in one side of coasting, sea in the other. Each small island is a point locating in the sea side. And any radar installation, locating on the coasting, can only cover d distance,
so an island in the sea can be covered by a radius installation, if the distance between them is at most d.

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

 

[align=left]Input[/align]
The input consists of several test cases. The first line of each case contains two integers n (1<=n<=1000) and d, where n is the number of islands in the sea and d is the distance of coverage of the radar installation. This is followed
by n lines each containing two integers representing the coordinate of the position of each island. Then a blank line follows to separate the cases.

The input is terminated by a line containing pair of zeros

 

[align=left]Output[/align]
For each test case output one line consisting of the test case number followed by the minimal number of radar installations needed. "-1" installation means no solution for that case.
 

[align=left]Sample Input[/align]

3 2
1 2
-3 1
2 1

1 2
0 2

0 0

 

[align=left]Sample Output[/align]

Case 1: 2
Case 2: 1

 

大意:以海岸为x轴,x轴上方有一些小岛,然后给出雷达扫描范围及小岛坐标,然后求出能使用的最少雷达数,其实大意和喷水装置差不多。

刚开始没看到那个是陆地,(汗- -!,想了一大会才看到land,(汗= =!

把每个岛求出其雷达能放置的范围,然后检查后面的小岛是否能被这个雷达扫描到,如果不能,则说明要放置新的雷达。
ac代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#define MAXN 1010
using namespace std;
struct s
{
double x;
double y;
}d[MAXN];
bool cmp(s a,s b)
{
if(a.x==b.x)
return a.y>b.y;
return a.x<b.x;
}
int main()
{
int m,n,i;
double s,really;
int sum=0;
int a,b;
while(scanf("%d%d",&n,&m)!=EOF,m||n)
{
int bz=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&a,&b);
d[i].x=double(a)-sqrt(double(m*m-b*b));//记录范围
d[i].y=double(a)+sqrt(double(m*m-b*b));
if(b>m)
bz=1;
}
if(bz)
printf("-1\n");
else
{
sort(d,d+n,cmp);
double really=d[0].y;
int num=1;
for(i=1;i<n;i++)
{
if(d[i].x>really)
{
num++;
really=d[i].y;
}
}
printf("Case %d: %d\n",++sum,num);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: