POJ1328 Radar Installation 【贪心·区间选点】
2014-11-10 17:53
232 查看
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
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
Sample Output
Source
Beijing 2002
#include <string.h>
#include <math.h>
#include <algorithm>
#define maxn 1010
using namespace std;
struct Node {
double u, v;
friend bool operator<(const Node& a, const Node& b) {
return a.u < b.u;
}
} E[maxn];
int N, D;
int main() {
int i, ok, id, ans, cas = 1;
double x, y, d, flag;
while(scanf("%d%d", &N, &D), N) {
printf("Case %d: ", cas++);
ok = 1; id = 0;
for(i = 0; i < N; ++i) {
scanf("%lf%lf", &x, &y);
if(y > D) ok = 0;
if(!ok) continue;
d = sqrt(D * D - y * y);
E[id].u = x - d;
E[id++].v = x + d;
}
if(!ok) {
printf("-1\n");
continue;
}
sort(E, E + id);
flag = E[0].v; ans = 1;
for(i = 1; i < N; ++i) {
if(E[i].u <= flag) {
if(E[i].v <= flag) flag = E[i].v;
continue;
}
++ans; flag = E[i].v;
}
printf("%d\n", ans);
}
return 0;
}
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 54593 | Accepted: 12292 |
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
区间选点:按左端排序,flag控制右端,若下一项的左端比flag小则看其右端,若右端也比flag小则更新flag,若下一项的左端比flag大,更新flag为这一项的左端并++ans。
#include <stdio.h>#include <string.h>
#include <math.h>
#include <algorithm>
#define maxn 1010
using namespace std;
struct Node {
double u, v;
friend bool operator<(const Node& a, const Node& b) {
return a.u < b.u;
}
} E[maxn];
int N, D;
int main() {
int i, ok, id, ans, cas = 1;
double x, y, d, flag;
while(scanf("%d%d", &N, &D), N) {
printf("Case %d: ", cas++);
ok = 1; id = 0;
for(i = 0; i < N; ++i) {
scanf("%lf%lf", &x, &y);
if(y > D) ok = 0;
if(!ok) continue;
d = sqrt(D * D - y * y);
E[id].u = x - d;
E[id++].v = x + d;
}
if(!ok) {
printf("-1\n");
continue;
}
sort(E, E + id);
flag = E[0].v; ans = 1;
for(i = 1; i < N; ++i) {
if(E[i].u <= flag) {
if(E[i].v <= flag) flag = E[i].v;
continue;
}
++ans; flag = E[i].v;
}
printf("%d\n", ans);
}
return 0;
}
相关文章推荐
- POJ1328 Radar Installation (区间选点问题,贪心)
- UVA 10148 Advertisement (贪心 + 区间选点问题)
- UVa 1193 / POJ 1328 / Beijing 2002 Radar Installation (贪心&区间选点)
- 小白书贪心之区间选点问题
- 贪心之区间选点
- UVA 10148 Advertisement 贴广告的艺术 贪心 区间选点
- POJ 1328 Radar Installation(贪心——最少区间选点覆盖)
- 区间选点问题(贪心)
- poj 1328 Radar Installation 【贪心】【区间选点问题】
- poj 1328 Radar Installation 【贪心】【区间选点问题】
- UVA - 10148 Advertisement(贪心 区间选点)
- 区间贪心及区间选点问题
- 百练+贪心区间选点+最少点覆盖尽量多的区间
- 高速公路【贪心·区间选点】
- NYOJ891 找点(贪心区间选点问题)
- 8.4.5(区间选点_简单贪心)
- NYOJ 287 Radar 贪心之 区间选点
- POJ 1328 && NYOJ 891 - 贪心 区间选点问题
- UVA 10148 Advertisement (贪心 + 区间选点问题)
- [POJ 1201] Intervals (区间贪心选点)