poj1328--Radar Installation

本文介绍了一个关于使用最少数量的雷达覆盖海岸线的问题,并采用贪心算法求解。通过对小岛坐标的转化和排序,实现了有效覆盖方案的设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本题应用贪心算法


一、首先应当将问题转化为给定雷达半径d,小岛坐标 ,计算出以小岛为圆心,d为半径的圆能辐射的海岸区间,如下图所示:

 

二、将所有的小岛都映射到x坐标上。得下图模式:

 

将每个小岛映射的信息存到一个结构体中,

struct island
{
 double x,y; //x,y坐标
 double s,f;  //s为开始坐标,f为结束坐标
};

然后对这些小岛按区间开始坐标升序排列。

可以应用贪心算法的理论依据:

1、先做出一个选择,得到一个子问题;

2、由于最左边的小岛(红色区间)必然要被一个雷达覆盖,因此必然有个雷达在A~E区间内,做出这个贪心选择后,剩下的子问题同样有个“最左边的小岛”,即具有同样的结构性质。

满足:将做出的贪心选择和子问题的最优解合并后可得到整个问题的最优解。

 

三、具体操作:

按小岛区间开始坐标升序排列后,从左往右,对于第一个小岛(红色区间),因为我们要求最少放多少个雷达,所以雷达放置的位置应该尽可能多的覆盖到多个小岛,对于第一个小岛的覆盖区间A~E,当然是放在E处能尽可能多得覆盖到小岛啦,于是先将雷达放在E处,继续观察第二个小岛(蓝色区间),发现蓝色区间也覆盖了E点,那么OK。继续观察第三个小岛(绿色区间),发现E并不在绿色区间内,于是需要将雷达位置左移动,移动到绿色区间结束的位置,即点D。之后再看下一个小岛的区间起始是否在D点左边。若是,则继续此类观察,若否则一次搜索结束。具体见代码。

 

 

四、代码

我在网上找了很多测试用例都能通过,但是就是无法通过poj官方测试。欢迎大家指出我程序中的问题!

#include<iostream>
#include<math.h>

using namespace std;

struct island
{
	double x,y; //x,y坐标 
	double s,f;  //s为开始坐标,f为结束坐标
};

int cmp(const void* a, const void* b)
{
	island  x1 = *(island*)a;
	island  x2 = *(island*)b;

	return (x1.s) - (x2.s);
}

int main()
{
	int n;
	double d;  // 半径
	int i;
	double offset;
	island islands[1000];
	int num = 1;
	while(true)
	{
		cin>>n>>d;
		if(0 == n && 0 == d)
			break;
		bool flag = true;
		for(i = 0; i < n ; i++)
		{
			cin>>islands[i].x>>islands[i].y;
			if(islands[i].y > d || islands[i].y < 0 || d <= 0)
			{
				flag = false;
			}

			if(true)
			{
				offset = pow(d*d-islands[i].y*islands[i].y,0.5);
				islands[i].s = islands[i].x - offset;
				islands[i].f = islands[i].x + offset;
			}
		}

		if(!flag)
		{
			cout<<"Case "<<num++<<": "<<-1<<endl;
			continue;
		}
		qsort(islands,n,sizeof(island),cmp);
		
		int count = 0;
		for(i = 0 ; i < n ; i++)
		{
			int m = i+1;
			//cout<<"the: "<<i<<endl;
			count ++;
			if(m >= n)
				break;
			double finish = islands[i].f;
			
			while(islands[m].s <= finish) 
			{
				if(islands[m].f < finish)
					finish = islands[m].f;

				m++;
			}
			i = m-1;

		}
		cout<<"Case "<<num++<<": "<<count<<endl;
	}
	//system("pause");
	return 0;
}


 

内容概要:本文档详细介绍了Analog Devices公司生产的AD8436真均方根-直流(RMS-to-DC)转换器的技术细节及其应用场景。AD8436由三个独立模块构成:轨到轨FET输入放大器、高动态范围均方根计算内核和精密轨到轨输出放大器。该器件不仅体积小巧、功耗低,而且具有广泛的输入电压范围和快速响应特性。文档涵盖了AD8436的工作原理、配置选项、外部组件选择(如电容)、增益调节、单电源供电、电流互感器配置、接地故障检测、三相电源监测等方面的内容。此外,还特别强调了PCB设计注意事项和误差源分析,旨在帮助工程师更好地理解和应用这款高性能的RMS-DC转换器。 适合人群:从事模拟电路设计的专业工程师和技术人员,尤其是那些需要精确测量交流电信号均方根值的应用开发者。 使用场景及目标:①用于工业自动化、医疗设备、电力监控等领域,实现对交流电压或电流的精准测量;②适用于手持式数字万用表及其他便携式仪器仪表,提供高效的单电源解决方案;③在电流互感器配置中,用于检测微小的电流变化,保障电气安全;④应用于三相电力系统监控,优化建立时间和转换精度。 其他说明:为了确保最佳性能,文档推荐使用高质量的电容器件,并给出了详细的PCB布局指导。同时提醒用户关注电介质吸收和泄漏电流等因素对测量准确性的影响。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值