UVA 1193 (区间覆盖(贪心))

来源:互联网 发布:网络叫人 编辑:程序博客网 时间:2024/06/13 10:48

题意是:在直角坐标系中,x方向是海岸线,x轴上方是岛屿,问至少有又多少个雷达才能把所有岛屿影响到,这题有个坑,输出-1时有几种情况:1.d<0 2.y<0 3.y>d,我们可以把每个岛屿的位置和d通过直角转换成x轴方向的点,然后题目就变成区间覆盖问题了

Description

Download as PDF

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 coverd distance, so an island in the sea can be covered by a radius installation, if the distance between them is at mostd .

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 itsx - y coordinates.

\epsfbox{p2519.eps}

Input 

The input consists of several test cases. The first line of each case contains two integersn(1$ \le$n$ \le$1000) and d , where n is the number of islands in the sea andd is the distance of coverage of the radar installation. This is followed byn 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 21 2-3 12 11 20 20 0

Sample Output 

Case 1: 2Case 2: 1
AC代码:

#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>#include<string>#include<vector>#include<queue>#include<map>#include<set>#define INF 999999999#define LL long long#define mod 1000003using namespace std;struct node{double zuo, you;};node po[1005];int cmp(node a, node b){return a.zuo < b.zuo;}int main(){int n, d;int cnt = 0;while (scanf("%d%d", &n, &d)&&n&&d){int f = 0;double x, y;for (int i = 0; i < n; i++){scanf("%lf%lf", &x, &y);if (y > d||y<0||d<0)f = 1;else{//转化为区间int xx = int(sqrt(d*d - y*y));po[i].zuo = x - xx, po[i].you = x + xx;}}printf("Case %d: ", ++cnt);if (f){printf("-1\n");continue;}int ans = 1;sort(po, po + n, cmp);int xx = po[0].you;for (int i = 1; i < n; i++){if (po[i].zuo > xx){ans++;xx = po[i].you;}else if (po[i].zuo < xx&&po[i].you < xx){xx = po[i].you;}}printf("%d\n", ans);}}


0 0
原创粉丝点击