Radar Installation

xiaoxiao2021-02-28  47

B - Radar Installation

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

题意:给出岛屿的坐标和雷达的辐射范围,在x轴上求出能够将所有岛屿覆盖所需的最小雷达数,若不能完成则输出-1。

题解:求出各个岛屿到x轴的距离,再由此求出在x轴上可行的范围,再将范围排序,从左到右安放雷达,当下一个范围的左界大于雷达安放的坐标,则需要再增加一个雷达在这个范围的右界。若下一个范围的右界大于雷达安放的坐标,则将该雷达移动至右界,数量不变,若小于雷达安放的坐标,则雷达的位置和数量都不变,继续下一个范围的判断。

注意:一定一定要注意用double。

#include <cstdio> #include <iostream> #include <algorithm> #include <cmath> using namespace std; const int maxn = 2500; int ans = 0; typedef struct NODE { double l; double r; }node; bool cmp(node a,node b) { if(a.l == b.r) { return a.r < b.r; } return a.l < b.l; } void solve(int n,node node[]) { double sign = -1000000000; int i; for(i = 0;i < n;i++) { if(node[i].l > sign) { ans++; sign = node[i].r; } else { if(node[i].r < sign) { sign = node[i].r; } } } } int main() { node node[maxn]; int n,d; int flag; int i; int count = 0; double x[maxn],y[maxn]; while(scanf("%d%d",&n,&d) != EOF) { if(!n && !d) break; ans = 0; flag = 1; count++; for(i = 0;i < n;i++) { scanf("%lf%lf",&x[i],&y[i]); if(y[i] > d) { flag = 0; } } if(!flag) { printf("Case %d: %d\n",count,-1); } else { double z; for(i = 0;i < n;i++) { z = sqrt(d * d * 1.0 - y[i] * y[i]); node[i].l = x[i] - z; node[i].r = x[i] + z; } sort(node,node + n,cmp); solve(n,node); printf("Case %d: %d\n",count,ans); } } return 0; }
转载请注明原文地址: https://www.6miu.com/read-2631269.html

最新回复(0)