D:Radar Installation

D:Radar Installation

總時間限制: 

1000ms

 

內存限制: 

65536kB

描述

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

輸入

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

輸出

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.

樣例輸入

3 2
1 2
-3 1
2 1

1 2
0 2

0 0

樣例輸出

Case 1: 2
Case 2: 1

來源

Beijing 2002

解題思路:

將每個島嶼通過勾股定理投影到海岸線x軸上,投影得一直線,直線範圍內只要有一個雷達就表示此島嶼在雷達範圍內,於是問題轉換成有多組線段在x軸上,尋求一個最少的雷達數量能讓所有線段內部都有雷達。非常典型的貪心法

#include<bits/stdc++.h>

using namespace std;

bool cmp(pair<double,double> a,pair<double,double> b)
{
    return a.second<b.second;
}

int main()
{
    //freopen("in.txt","r",stdin);
    int n;
    double d;
    int po=1;
    bool f;
    while(scanf("%d %lf", &n, &d)&&(n||d))
    {
        f=true;
        double x,y;
        vector<pair<double,double> > vec;
        for(int i=0;i<n;i++)
        {	
            scanf("%lf %lf", &x, &y);
            if(!f) continue;
            double dx;
            dx=d*d-y*y;
            if(y<=d)
            	vec.push_back(pair<double,double>(x-sqrt(dx),x+sqrt(dx)));
            else
            {
            	f=false;
            }
        }
        printf("Case %d: ",po++);
        if(!f)
        {
        	printf("-1\n");
        	continue;
        }
        sort(vec.begin(),vec.end(),cmp);
        int k=0;
		double temp=-100000000;
        for(int i=0;i<n;i++)
        {
            if(temp<vec[i].first)
            {
                k++;
                temp=vec[i].second;
            }
        }
        printf("%d\n",k);
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章