1328 Radar Installation

    技术2022-05-18  15

    Radar Installation Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 25394 Accepted: 5495

    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

    Source

    Beijing 2002 孤单的男人写代码呀写代码。 贪心类题目。 #include<stdio.h> #include<math.h> #include<stdlib.h> struct Region { double begin; double end; }region[1008]; int cmp( void const *a, void const *b) { if ( ((struct Region*)a)->begin != ((struct Region*)b)->begin ) return ((struct Region*)a)->begin > ((struct Region*)b)->begin ? 1 : -1; else return ((struct Region*)a)->end > ((struct Region*)b)->end ? 1 : -1; } int greed(int n) { double currentEnd = region[0].end; int i, count = 1; for(i=1; i<n; ++i) { if( region[i].begin <= currentEnd ) { currentEnd = currentEnd < region[i].end ? currentEnd : region[i].end; } else { currentEnd = region[i].end; ++count; } } return count; } int main() { // freopen("out.txt", "w", stdout); int n, d, i, x, y, Case = 1, flag; while(scanf("%d %d",&n, &d) != EOF) { flag = 0; if(0==n && 0==d) break; for(i=0; i<n; ++i) { scanf("%d %d", &x, &y); if(y>d) { flag = 1; } else { region[i].begin = x - sqrt(d*d - y*y); region[i].end = x + sqrt(d*d - y*y); } } printf("Case %d: ", Case++); if(flag) { printf("%d/n", -1); } else { qsort(region, n, sizeof(region[0]), cmp); printf("%d/n", greed(n)); } } return 0; }

    最新回复(0)