POJ 1328 贪心、快排/求最少雷达数量

本文介绍了一种确定岛屿上雷达最少数量的算法。通过计算每个岛屿在指定范围内的雷达覆盖区域并进行排序,确保雷达覆盖所有岛屿的同时达到最小数量。讨论了算法实现细节及代码示例。

对于每个岛屿,计算出在区间[A,B]内必须有一个雷达,对这些区间的左坐标进行排序

第一个岛屿的右坐标为right,

初始雷达数量为1,对于第二个岛屿,如果它的右坐标比right小,则说明区间2包含了区间1,不用增加雷达数量,并设置right = 岛屿2的右坐标;

如果它的右坐标比right大,又岛屿2的左坐标大于right,则雷达数量+1,并设置right = 岛屿2的右坐标.

#include <algorithm>
#include <math.h>
#include <iostream>
using namespace std;
typedef struct island{
	double l;
	double r;
}Node;
int   qcmp(   const   void   *arg1,   const   void   *arg2   )   
{   
	
	return   (((Node*)arg1)->l >  ((Node*)arg2)->l)?1:-1;
}
int   cmp(   Node   arg1,   Node   arg2   )   
{   
	
	return   arg1.l<  arg2.l;
}
int main(int argc, char* argv[])
{
	//freopen("d:/t.txt","r",stdin);
	int count;
	int r;
	
	int c = 0;
	while(cin>>count>>r&&(count||r)){
		bool err = false;
		Node n[1000];
		c++;
		for(int i=0;i<count;i++){
			double x,y;
			cin>>x>>y;
			y=y<0?-y:y;
			if(y>r){
				err = true;
			}
			double d = sqrt(r*r-y*y);
			
			n[i].l = x-d;
			n[i].r = x+d;
			
		}
		if(err)
		{
			printf("Case %d: -1\n",c);
			continue;
		}
		qsort(n,count,sizeof(n[0]),qcmp);
		//sort(n,n+count,cmp);
		
		int ans = 1;
		double left = n[0].r;

		for(int j=1;j<count;j++){
			if(n[j].r<=left){
				left = n[j].r;
			}else{
				if(n[j].l>left){ans++;left = n[j].r;}
			}
		}
		printf("Case %d: %d\n",c,ans);
			
	}
	return 0;
}

转载于:https://www.cnblogs.com/yangyh/archive/2011/06/10/2077972.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值