poj 1328(贪心)

来源:互联网 发布:京东和淘宝年销售额 编辑:程序博客网 时间:2024/05/16 10:44

                          题目意思:

      就是在一条水平线上放雷达,每个雷达有一个扫描范围,求所有的岛屿都能扫描到时所需要的最少的雷达个数。

思路:

      先对每一个岛屿做一次处理,算出可以扫描到他们的雷达可以放在水平线上的范围,每一个岛屿都

对应一个水平线上的区间,这样就转化 到了一条线上了,当然雷达放在区间最右面更节省,所以最左面的雷达先放

在右边缘,设为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);


0 0
原创粉丝点击