poj1328_Radar Installation(贪心区间解决)

26 篇文章 0 订阅
2 篇文章 0 订阅

(poj 1328 题)

讲解:不再以雷达为中心找能最大覆盖岛屿的面积,而是一岛屿为中心,一最大距离d为半径找这个岛屿如果想要被覆盖,雷达所能在的位置区间。

把n个区间按照左边的大小排序,我们比较右边的大小来找有多少个独立的区间,独立区间的个数就是需要雷达的个数。(记住公共区间需要缩小区间范围(当存在包含关系的时候要更新比较区间max的大小))

这种题存在double 浮点型的题一定要仔细,double和int类型在比较的时候会丢失精度出错率极大

重点是还不好找错。我交了n遍了一直wwwwww很扎心的!

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;

struct qujian{
	double s;
	double e;
}q[1005];
int c=0;
int cmp(qujian a,qujian b)
{
	return a.s<b.s;
} 

int main()
{
   int n,d,sum,flag,y;
   double x;  
   while(~scanf("%d%d",&n,&d)&&n+d)
   {
   	int i,j;
   	flag=0;  
 	if(d<=0)flag=1;
   	for(i=0;i<n;i++)
   	{
   		 scanf("%lf%d",&x,&y);
   		 if(fabs(y)<=d)
   		{
   		double r=sqrt(double(d*d-y*y));
   			q[i].s=x-r;
   			q[i].e=x+r;
   		}
   		else //区间问题 
   		  flag=1;
   		
   	}
   	  

   	if(flag)
   	{
   		printf("Case %d: -1\n",++c);
   		continue;
   	}
 	sort(q,q+n,cmp);
 
	double max=q[0].e;
	    sum=1;
	for(i=0;i<n;i++)
	{
	
		if(q[i].s>max)//不存在公共部分
		{
			sum++;
			max=q[i].e;
		}
		else//存在公共部分
		{
			if(q[i].e<max)//属于包含关系得时候要缩小公共区间的范围
			   max=q[i].e;
		}
	}	    
	 printf("Case %d: %d\n",++c,sum); 	  
   }	
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值