您的位置:首页 > 其它

POJ1328——Radar Installation(贪心)

2016-11-28 19:07 375 查看
题目链接

       题目大意是在给定的坐标系中在x轴上方有许多岛屿,然后你可以在x轴上设置雷达,雷达有探测范围d,要求尽量少的雷达将所有岛屿探测入内,如果无法搜索完全部岛屿,输出-1。先开始贪心方式错了,送了两个wrong,起先认为按横坐标从小到大排序然后更新雷达位置就行了,后来发现雷达的位置并不是随岛屿横坐标越大,就一定会更新到越大的位置,有可能会变小,所以这种想法是不对的,后来换成从雷达覆盖区间的交集来考虑才得出正确方式,还是先排序,对当前岛屿所能设置的雷达区间与先前存在的雷达区间取交集,如果有交集,证明先前设置的雷达区间交集部分仍旧能探测当前岛屿,那么久直接更新雷达区间为交集区间。如果取不到交集,那么久从新设置新的雷达,并将新的区间更新为雷达区间,每做一次这样的更新cont++即可,最后cont值即为最少所需雷达数。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>

using namespace std;

struct node
{
double x;
double y;
node()
{
x=0;
y=0;
}
} s[1005];

bool cmp(node a,node b)
{
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}

int main()
{
//freopen("in.in","r",stdin);
int n;
double d;
int time=0;
while(scanf("%d%lf",&n,&d))
{
if(n==0&&d==0)break;
time++;
for(int i=0;i<n;i++)
scanf("%lf %lf",&s[i].x,&s[i].y);
sort(s,s+n,cmp);
double pre_l=0, pre_r=0;
int cont=0;
bool flag=0;
for(int i=0;i<n;i++)
{
if(d<s[i].y)
{
flag=1;
break;
}
double now_l=s[i].x-sqrt(d*d-s[i].y*s[i].y);
double now_r=s[i].x+sqrt(d*d-s[i].y*s[i].y);
if(i==0)
{
pre_l=now_l;
pre_r=now_r;
cont++;
continue;
}
if(pre_r<now_l)//无交集
{
pre_l=now_l;
pre_r=now_r;
cont++;
}else//有交集,更新交集
{
if(pre_l<=now_l)pre_l=now_l;
if(now_r<=pre_r)pre_r=now_r;
}
}
if(flag)printf("Case %d: -1\n",time);
else printf("Case %d: %d\n",time,cont);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  贪心