POJ 1328 Radar Installation
来源:互联网 发布:七天网络查分登陆入口w 编辑:程序博客网 时间:2024/05/29 02:49
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
思路:典型贪心。算出每个岛在x轴上的左右区间,按照左区间排序。如某区间中完全包含另一个区间,则忽略这个区间。每个雷达都放在右区间处。
注意代码中的
return (((struct point*)a)->l)>(((struct point*)b)->l)?1:-1;
不能写成
return ((struct point*)a)->l)-(((struct point*)b)->l;
代码:
#include <cstdio>#include <iostream>#include <cstring>#include <vector>#include <map>#include <string>#include <cstring>#include <cmath>#include <algorithm>#include <cstdlib>using namespace std;struct point{ double r,l;}s[1000+10];int comp(const void *a,const void *b){ return (((struct point*)a)->l)>(((struct point*)b)->l)?1:-1;}int main(void){ #ifdef LOCAL freopen("in.txt","rb",stdin); //freopen("out.txt","wb",stdout); #endif // LOCAL int n,d,time=0; while(scanf("%d%d",&n,&d)==2 && !(n==0 && d==0)) { int ok=1; for(int i=0;i<n;i++) { int tempx,tempy; double tempd; cin >> tempx >> tempy; if(tempy>d) ok=0; if(ok) { tempd=sqrt((double)(d*d-tempy*tempy)); s[i].l=tempx-tempd; s[i].r=tempx+tempd; } } if(!ok) { printf("Case %d: %d\n",++time,-1); continue; } qsort(s,n,sizeof(s[0]),comp); int vis[1000+10]; memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) for(int j=i+1;j<n;j++) { if(s[j].l>s[i].r) break; if(s[j].l>=s[i].l && s[j].r<=s[i].r) { vis[i]=1; break; } } int sum=0; for(int i=0;i<n;i++) { if(!vis[i]) { vis[i]=1; sum++; for(int j=i+1;j<n;j++) { if(s[j].l<=s[i].r && s[i].r<=s[j].r) vis[j]=1; if(s[j].l>s[i].r) break; } } } printf("Case %d: %d\n",++time,sum); } return 0;}
- POJ 1328 "Radar Installation"
- POJ 1328 Radar Installation
- POJ 1328 Radar Installation
- POJ 1328 Radar Installation
- 1328 poj Radar Installation
- poj 1328 Radar Installation
- POJ 1328 Radar Installation
- poj 1328 Radar Installation
- poj 1328 Radar Installation
- POJ 1328 Radar Installation
- POJ 1328 Radar Installation
- POJ 1328 Radar Installation
- POJ 1328 Radar Installation
- POJ 1328 Radar Installation
- poj 1328 Radar Installation
- POJ-1328-Radar Installation
- poj 1328 Radar Installation
- POJ 1328 Radar Installation
- NSArray 数组排序 block
- [IOS]二维曲线图表
- [ssh新闻发布系统二] 读取新闻
- for循环使用之tips
- XCTest 断言总结
- POJ 1328 Radar Installation
- @Responsbody 输出错误
- android input子系统之一:驱动部分
- C#中new和override的区别
- Linux内核之中断
- Xcode 插件优缺点对比
- xampp修改mysql数据库密码
- R语言の快速排序
- Ubuntu 14.04 映射Caps_Lock 为Ctrl