题目:
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,在覆盖该点的前提下,判断能否尽可能覆盖该点左边的点,如果能覆盖,就将可以被覆盖的点出队列,重复这一步骤。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>using namespace std;
const long double PI=atan(1)*4;
int main(){
int t;
cin>>t;
while(t--){
int n,f;
double cake[10003];
double left=0;
double right=0;
cin>>n>>f;
for(int i=0;i<n;i++){
int k;
cin>>k;
cake[i]=PI*k*k;
if(cake[i]>right)right=cake[i];
}
while(right-left>1e-6){
double mid=(right+left)/2;
int sum=0;
for(int i=0;i<n;i++){
sum=sum+int(cake[i]/mid);
}
if(sum>=f+1)left=mid;
else right=mid;
}
printf("%.4lf\n",left);
}
return 0;
}