poj 1328(贪心)

                          题目意思:

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

思路:

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

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

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


你可能感兴趣的:(poj 1328(贪心))