Poj 1328 Radar Installation
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Poj 1328 Radar Installation相关的知识,希望对你有一定的参考价值。
原题:http://poj.org/problem?id=1328
题目给出了n个点(岛屿)的横纵坐标与半径d,要求在x轴上找到最少的点(雷达),以这些点为中心,半径为 d 的范围,包含所有的岛屿。
一开始直接想,对每个雷达可能出现位置做判断,用雷达去"找"岛,但很快否决,因为明显雷达可能的位置在特别坏的数据下会惊人地多,于是想用岛来"找雷达"
沿着这个思路分析了一下,发现对于每个岛,可以扫描到它的雷达范围为 x-sqrt(d*d-y*y)(原谅我不会打根号)到x+sqrt(d*d-y*y),这样我们就可以将问题变为给出若干个
区间,每个区间都包含至少一个点,要求点的数目最少。这就是区间选点的问题了,(难怪被放到贪心里),首先用上述方法得到区间,然后按右端点从小到大排序,从第一区间开始,
每次选择区间最后一个点,若该点被下一区间包含,则继续使用该点,否则选择下一个区间最后一个点。
-
#include <iostream>
-
#include <cstdio>
-
#include <queue>
-
#include <cstring>
-
#include <cmath>
-
#include <cstdlib>
-
#include <vector>
-
#include <string>
-
#include <algorithm>
-
#define CLR(arr) memset(arr,0,sizeof(arr))
-
#define N 1005
-
#define MOD 1E9+7
-
#define EPS 1E-6
-
//#define LOCAL
-
typedef long long ll;
-
using namespace std;
-
int n,d;
-
typedef struct RANGE{
-
double L;
-
double R;
-
}range;
-
range ran[N];
-
int cmp(const void *a,const void*b){
-
return ((range*)a)->R > ((range*)b)->R?1:-1;//这里有坑,用快排对浮点数排序使用方法与整数略有不同,用sort就遇不到这个坑。
-
}
-
int work(){
-
double cur=ran[0].R;
-
int ans=1;
-
for(int i=1;i<n;i++){
-
if(ran[i].L>cur){
-
cur=ran[i].R;
-
ans++;
-
}
-
}
-
return ans;
-
}
-
int main()
-
{
-
#ifdef LOCAL
-
freopen("input.txt", "r", stdin);
-
//freopen("output.txt", "w", stdout);
-
#endif
-
int T=1,flag;
-
double t,x,y;
-
while(scanf("%d%d",&n,&d),n||d){
-
flag=1;
-
for(int i=0;i<n;i++){
-
scanf("%lf%lf",&x,&y);
-
if(flag&&y<=d&&d>0&&y>=0){//这是另外的坑,y和d的各种坑爹情况,不过奇怪的是将y>=0去掉也能AC,但时间反而变慢了。。
-
t=sqrt(d*d-y*y);
-
ran[i].L=x-t;
-
ran[i].R=x+t;
-
}
-
else flag=0;
-
}
-
if(flag)qsort(ran,n,sizeof(ran[0]),cmp);
-
printf("Case %d: %d\n",T++,flag?work():-1);
-
}
-
return 0;
-
}
因为做过区间选点问题的题目,代码很快撸出来了,但是因为一开始没用double被坑了一次,因为快排对浮点数的坑有被WA了一次(>﹏<)我觉得以后要转sort了,
各种角度看来都更方便。顺便感谢一下这个链接:http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/;
明天就要返校了,我讨厌长途。
以上是关于Poj 1328 Radar Installation的主要内容,如果未能解决你的问题,请参考以下文章