题目意思:
就是在一条水平线上放雷达,每个雷达有一个扫描范围,求所有的岛屿都能扫描到时所需要的最少的雷达个数。
思路:
先对每一个岛屿做一次处理,算出可以扫描到他们的雷达可以放在水平线上的范围,每一个岛屿都
对应一个水平线上的区间,这样就转化 到了一条线上了,当然雷达放在区间最右面更节省,所以最左面的雷达先放
在右边缘,设为max然后对2---n这些点进行遍历,next表示下一个点,(区间为了(left,right));如果
left大于max,则雷达个数加1;否则,看right是否小于max,若是则更新max值为right,否则继续向后遍历。
注意:当存在坐标的纵坐标大于d值的时候将不会别雷达检测到,这样输出-1.
终于过了,wa了好多好多次,最后还是从网上找了一篇题解,对比着找错误,原来我用qsort函数的时候
cmp返回值有可能不是整数,而是一个0到1之间的小数,就在这个地方跪了好多次
将近3个小时才把他给A了,这么
简单的贪心算法,,所以以后做题一定要加倍细心,好好想想怎么写,不能有一点思路就敲代码
要深思熟虑才是,嘿
嘿,a_jie现在估计在帮我抄马原论文
,我一定会努力的,为了我们的将来
贴代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef struct
{
double x,y;
}node;
node map[1005];
int cmp(const void *a,const void *b)
{
if(((node *)a)->x==((node *)b)->x)
return ((node *)a)->y-((node *)b)->y;
return ((((node *)a)->x-((node *)b)->x)>0)?1:-1;
}
/*int qsort(int s,int t)
{
int i,j;
double mid,tmp;
i=s;j=t;mid=map[(i+j)/2].x;
while (i<=j)
{
while (map[i].x<mid) i++;
while (map[j].x>mid) j--;
if (i<=j)
{
tmp=map[i].x;map[i].x=map[j].x;map[j].x=tmp;
tmp=map[i].y;map[i].y=map[j].y;map[j].y=tmp;
i++;
j--;
}
}
if (s<j) qsort(s,j);
if (i<t) qsort(i,t);
}*/
int main()
{
int n,i,j,d,x,y,count=0;
while(scanf("%d%d",&n,&d),n!=0||d!=0)
{
count++;
int flag=0;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(y>d||d<0)
{
flag=1;
}
if(flag==0)
{
map[i].x=x-sqrt(d*d*1.0-y*y*1.0);
map[i].y=x+sqrt(d*d*1.0-y*y*1.0);
}
}
if(flag)
{
printf("Case %d: %d\n",count,-1);
continue;
}
qsort(map+1,n,sizeof(map[0]),cmp);
//qsort(1,n);
// for(i=1;i<=n;i++)
// printf("x=%f y=%f\n",map[i].x,map[i].y);
double max=map[1].y;
int ans=1;
for(i=2;i<=n;i++)
{
if(map[i].x>max)
{
ans++;
//if(map[i].y>max)
max=map[i].y;
}
else if(map[i].y<max)
max=map[i].y;
}
printf("Case %d: %d\n",count,ans);
}
return 0;
}另外贴一段快排的代码,省的以后想掌握时找不到模板
:
int qsort(int s,int t)
{
int i,j;
double mid,tmp;
i=s;j=t;mid=map[(i+j)/2].x;
while (i<=j)
{
while (map[i].x<mid) i++;
while (map[j].x>mid) j--;
if (i<=j)
{
tmp=map[i].x;map[i].x=map[j].x;map[j].x=tmp;
tmp=map[i].y;map[i].y=map[j].y;map[j].y=tmp;
i++;
j--;
}
}
if (s<j) qsort(s,j);
if (i<t) qsort(i,t);
}qsort(1,n);
493

被折叠的 条评论
为什么被折叠?



