Radar Installation
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 90543 Accepted: 20340
Description
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
Input
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
Output
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.
Sample Input
3 2
1 2
-3 1
2 1
1 2
0 2
0 0
Sample Output
Case 1: 2
Case 2: 1
题意:给出n个岛屿,雷达的扫描范围m,找出最少需要多少个雷达才能覆盖这些岛屿(要使得尽可能覆盖,雷达肯定会在x轴上),不能覆盖完全输出“-1”。
贪心,一开始就想到对岛的x排序,然后使得雷达的扫描范围圈尽量往右靠(岛在雷达扫描圈上),但是当第一个岛在第一个雷达扫描范围时,扫不到第二个岛的情况下,如果使得第二个岛在第一个雷达扫描圈上时,第一个岛能被第一个雷达扫到,就会wa了。
所以还得判断:从新的雷达开始判断的第二个或者之后的岛在圈上的情况(之后的岛的x坐标小于初始雷达位置的圆心x坐标)
说了一堆乱七八糟的,直接代码
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1005
#define inf 0x3f3f3f3f
struct node{
int x, y;
}nod[N];
bool cmp( const node &a1, const node &a2 )
{
if( a1.x != a2.x )
return a1.x < a2.x;
else
return a1.y < a2.y;
}
int main()
{
//freopen( "in.txt", "r", stdin );
int n, m, sum, flg, cas = 1;
while( scanf( "%d%d", &n, &m ) != EOF ){
if( n == 0 && m == 0 ) break;
for( int i = 0 ; i < n ; i ++ ){
scanf( "%d%d", &nod[i].x, &nod[i].y );
//cout<<nod[i].x<<" "<<nod[i].y<<endl;
}
sort( nod, nod+n, cmp );
// for( int i = 0 ; i < n ; i ++ ){
// cout<<nod[i].x<<" "<<nod[i].y<<endl;
// }
flg = sum = 0;
int left = inf;///初始化雷达的岛的x坐标
double cir = inf;///圆心x坐标
for( int i = 0 ; i < n ; i ++ ){
if( nod[i].y > m ) flg = 1;
if( cir == inf ){
cir = nod[i].x + sqrt((double)m*m-nod[i].y*nod[i].y);
left = i;
sum ++;///雷达数量
}
else if( m*m < (double)nod[i].y*nod[i].y + (cir-nod[i].x)*(cir-nod[i].x) ){
///判断岛是否在雷达扫描范围内
if( cir > nod[i].x ){
cir = nod[i].x + sqrt((double)m*m-nod[i].y*nod[i].y);
///之后的岛确定的雷达还能扫到前面的岛的时候就不用从这个岛接着判断
i --;
cir = inf;
left = inf;
}
}
else{
i --;
cir = inf;
left = inf;
}
}
}
cout<<"Case "<<cas++<<": ";
if( flg ){
cout<<"-1"<<endl;
}
else if( !sum ){///这里应该可以去掉
cout<<1<<endl;
}
else cout<<sum<<endl;
}
return 0;
}

解决如何用最少数量的雷达覆盖所有岛屿的问题,通过排序及贪心算法实现,判断每个岛屿是否在雷达覆盖范围内。
741

被折叠的 条评论
为什么被折叠?



