Poj 1068 Radar Installation(模拟水题)
题目
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
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
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
题解
此题思路不是问题,主要在与需要对结构体的某一元素进行排序的时候,sort调用的方法。
例如:
struct A { int a; int b; };
A arr[10];
//想要实现对arr中每个元素的a成员排序
bool cmp(A &a,A &b)
{
return a.a < b.a;
}
sort(arr, arr + n,cmp); //即可
代码
#include<iostream> #include<cmath> #include<algorithm> using namespace std; double cal(int x, int y, int r) { return (double)x+pow((r*r - y*y),0.5); } struct point { int x, y; double r; }; bool comp(point &p1, point &p2) { return p1.r < p2.r; } bool ok(int x, int y, double r,int R) { return ((double)x - r)*((double)x - r) + (double)y*(double)y <= (double)R*(double)R; } int main() { int q = 1; while (true) { int N, R; int n = 0; point p[1000]; int flag[1000]; scanf("%d %d", &N, &R); if (N == 0 && R == 0) break; for (int i = 0; i < N; i++) { scanf("%d %d", &p[i].x, &p[i].y); flag[i] = 0; if (p[i].y > R) n = -1; p[i].r = cal(p[i].x, p[i].y, R); } if (n != -1) { sort(p, p + N, comp); double cur; for (int i = 0; i < N; i++) { if (flag[i] == 0) { n++; cur = p[i].r; if (i == N - 1) break; for (int j = i + 1; j < N; j++) { if (p[j].r - cur > 2 * R) break; if (ok(p[j].x, p[j].y, cur, R)) flag[j] = 1; } } } } printf("Case %d: %d\n",q, n); q++; } }