Radar Installation POJ - 1328
题目链接:https://vjudge.net/problem/POJ-1328
题意:二维坐标系上,x轴上方区域内有n个点,x轴上可以安装雷达。雷达的探测半径是d。问最少放几个雷达,能够将这些点都探测到。
思路:
对每个点为圆心做半径为d的圆,可以算出在x轴上算出雷达区间。(在这个区间上放雷达可以探测到这个点)
可以得到n个区间[Li,Ri] i~[1,n]。
将n个区间按左端点值升序排列后,从第一个区间起计算有交集的最大区间个数,则这些区间对应的点可以用一个雷达来探测到。然后再去计算剩余区间有交集的最大区间个数。直到所有的点都被探测。
此时有交集的最大区间个数为3
比如:
这种情况下一共用三个雷达,计算的最大区间个数分别为3,1,1
具体见代码
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct pa{
int x;
int y;
}p[1007];
struct diat{
double l,r;
}dt[1007];
bool cmp(pa p1,pa p2){
return p1.x<p2.x;
}
bool cmpdt(diat d1,diat d2){
return d1.l<d2.l;
}
int main(){
int T=0;
int n,d;
while(cin>>n>>d){
T++;
if(n==0&&d==0)break;
int i;
int flag=1;
if(d<0)flag=0;
//-1 or possible
//y>d--gg
for(i=1;i<=n;i++){
cin>>p[i].x>>p[i].y;
if(p[i].y>d||p[i].y<0)flag=0;
}
//-1
if(flag==0){
cout<<"Case "<<T<<": ";
cout<<"-1\n";
continue;
}
sort(p+1,p+n+1,cmp);
//possible
for(i=1;i<=n;i++){
dt[i].l=p[i].x-sqrt(1.0*d*d-1.0*p[i].y*p[i].y);
dt[i].r=p[i].x+sqrt(1.0*d*d-1.0*p[i].y*p[i].y);
}
sort(dt+1,dt+n+1,cmpdt);
int ans=0;
diat newdt;//其实只需要记录右端点
for(i=1;i<=n;i++){
if(i==1){
ans++;
newdt=dt[i];
}
else{
if(dt[i].l<=newdt.r){
if(dt[i].r<=newdt.r){
newdt=dt[i];
}
}
else{
ans++;
newdt=dt[i];
}
}
}
cout<<"Case "<<T<<": ";
cout<<ans<<endl;
}
return 0;
}