Radar
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
描述
-
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.
![](http://acm.nyist.net/JudgeOnline/admin/kind/attached/20110505064233_82697.jpg)
输入
-
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
输出
-
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.
样例输入
-
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
样例输出
-
Case 1: 2
Case 2: 1
题目大意:
输入小岛的个数n,雷达的半径r,然后输入小岛的位置坐标。雷达只能建在海岸线(即x轴)上。问最少需要几个雷达才能覆盖所有小岛。
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#define N 1000
typedef struct
{
double left,right;
}Point;
int cmp(const void *a,const void *b)
{
return (*(Point *)a).left - (*(Point *)b).left;
}
int main()
{
int n,i,count,num=1;
double x[N],y[N],min,r;
double len;
Point point[N];
while(scanf("%d%lf",&n,&r))
{
if(n == 0 && r == 0)
break;
memset(point,0,sizeof(point));
for(i=0; i<n; i++)
{
scanf("%lf%lf",&x[i],&y[i]);
if(y[i] > r)
{
printf("Case %d:-1\n",num);
num ++;
break;
}
len = sqrt(r*r-y[i] *y[i]);
point[i].right = x[i] + len;
point[i].left = x[i] - len;
}
qsort(point,n,sizeof(Point),cmp);
count = 1;//初始雷达数为1,覆盖第一个小岛
min = point[0].right;//以第一个小岛与x轴的右交点为标准开始
for(i=1; i<n; i++)
{
if(point[i].left > min)//如果后一个小岛的左交点大于前一个的右交点,说明不相交
{
count ++;//需要多加一个雷达
min = point[i].right;//再以下一个小岛的右交点为标准探测
}
else
{
if(point[i].right < min)//如果,前一个的右交点小于后一个的左交点,前一个的雷达可以覆盖后一个
{
//不需要增加一个雷达
min = point[i].right;
}
}
}
printf("Case %d: %d\n",num,count);
num ++;
}
return 0;
}
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
3
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.
-
输入
-
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
输出
- 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. 样例输入
-
3 2 1 2 -3 1 2 1 1 2 0 2 0 0
样例输出
-
Case 1: 2 Case 2: 1
题目大意:
输入小岛的个数n,雷达的半径r,然后输入小岛的位置坐标。雷达只能建在海岸线(即x轴)上。问最少需要几个雷达才能覆盖所有小岛。
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <math.h>
#define N 1000
typedef struct
{
double left,right;
}Point;
int cmp(const void *a,const void *b)
{
return (*(Point *)a).left - (*(Point *)b).left;
}
int main()
{
int n,i,count,num=1;
double x[N],y[N],min,r;
double len;
Point point[N];
while(scanf("%d%lf",&n,&r))
{
if(n == 0 && r == 0)
break;
memset(point,0,sizeof(point));
for(i=0; i<n; i++)
{
scanf("%lf%lf",&x[i],&y[i]);
if(y[i] > r)
{
printf("Case %d:-1\n",num);
num ++;
break;
}
len = sqrt(r*r-y[i] *y[i]);
point[i].right = x[i] + len;
point[i].left = x[i] - len;
}
qsort(point,n,sizeof(Point),cmp);
count = 1;//初始雷达数为1,覆盖第一个小岛
min = point[0].right;//以第一个小岛与x轴的右交点为标准开始
for(i=1; i<n; i++)
{
if(point[i].left > min)//如果后一个小岛的左交点大于前一个的右交点,说明不相交
{
count ++;//需要多加一个雷达
min = point[i].right;//再以下一个小岛的右交点为标准探测
}
else
{
if(point[i].right < min)//如果,前一个的右交点小于后一个的左交点,前一个的雷达可以覆盖后一个
{
//不需要增加一个雷达
min = point[i].right;
}
}
}
printf("Case %d: %d\n",num,count);
num ++;
}
return 0;
}