题目意思:
就是在一条水平线上放雷达,每个雷达有一个扫描范围,求所有的岛屿都能扫描到时所需要的最少的雷达个数。
思路:
先对每一个岛屿做一次处理,算出可以扫描到他们的雷达可以放在水平线上的范围,每一个岛屿都
对应一个水平线上的区间,这样就转化 到了一条线上了,当然雷达放在区间最右面更节省,所以最左面的雷达先放
在右边缘,设为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);