`
人生难得糊涂
  • 浏览: 117697 次
社区版块
存档分类
最新评论

poj1328-贪心算法,雷达探测问题

 
阅读更多

题意就不说了很容易懂,说一下思路。 这道题问的是怎样放雷达使其放的雷达数目最少而能够探测到所有的岛屿,这里需要转换为求每个岛屿的能放雷达的区间的问题,。如下图



 

然后我们以每个区间的最右端排序,排完以后,我们定义个变量L,它表示现在已放置雷达能探测到的最左区间。我们用一个vis[]数组来标记一个岛屿是否已经能被探测到。

我们从i(i从n-1->0)开始(貌似也可以从左边开始),依次遍历之前的 每个区间 ,分三种情况,1,这个区间的最右端比L还小,则需要加一个雷达,2.这个区间的最右端比L要大,但是它的最左端比L要小,3.这个区间的最右端比L要大,其最左端也比i的L要大(既为现在能探测到区域的子区间).

1.对于第一种情况,我们要将雷达数加一,并把此区间的左端赋值给L。

2.对于第二种情况,我们现在已经放置的雷达能探测到它,不需要加雷达()

3.对于第三种情况,我们现在已经放置的雷达能探测到它,但是我们要把此区间的最左端赋值给L。

如下图,红色区域表示已经能探测到的区域



 

 

现在我们能够下出算法了,我对区间排序用的是qsort排序,这里简单的说下qsort的用法。

qsort(lend,n,sizeof(lend[0]),compare); 

第一个参数表示要排序的数组,第二个参数表示的是要排序多少个数,第三个一定要是sizeof(数组的第一个元素),第四个参数是比较函数。比较函数是要自己写的,但其返回值必须是int 并且形参一定是

(const void * a,const void * b)  (形参名a b可自行更改).

 

程序代码如下:

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#define len 1030
typedef struct Islend
{
	double right;
	double  left;
}Islend;
int compare(const void * a,const void * b)
{
	Islend *x=(Islend *)a;
	Islend *y=(Islend *)b;
	if(x->right>y->right)
		return 1;
	else 
		return -1;
	
}
int main()
{
	int n,i,j;
	double d;//雷达区间
	double x,y;
	int vis[len];
	Islend lend[len];
	int number=0;
	int num,flag;
	double l;//l表示当前所放雷达能探测到的最左区间,如果超过了最左区间 则需要加一个雷达
	while(1)
	{
		number++;
		scanf("%d",&n);
		scanf("%lf",&d);
		if(n==0)
			break;
		flag=1;//判断是否有探测不到的区域
		for(i=0;i<n;i++)
		{
			scanf("%lf",&x);
			scanf("%lf",&y);
			if(y>d) 
				flag=0;
			lend[i].right=x+sqrt((double)(d*d-y*y));//岛i可放的雷达区间为 lend[i].left -lend[i].right
			lend[i].left=x-sqrt((double)(d*d-y*y));
		}
		qsort(lend,n,sizeof(lend[0]),compare);//以区间右端排序
		num=1;
		memset(vis,0,sizeof(vis));
		l=lend[n-1].left;
		if(flag)
		{
			for(i=n-1;i>=0;i--)
			{
				for(j=i-1;j>=0;j--)
				{
					if(vis[j]==1)//如果在我们现有雷达能探测到的区域则直接跳过
						break;
					else
					{
						double f=lend[j].right;
						if(f>=l)//j在现有雷达探测到的范围内
						{
							
							if (lend[j].left>l)//如果是子区间
							{
								l=lend[j].left;//这里赋值的意思是表明如果超过这个子区间的最左端则又要加一个雷达
							}
						}
						else
						{
							num++;
							l=lend[j].left;
						}
					}
					vis[j]=1;//表明岛i 现在可探测到了
					
				}
			}
			printf("Case %d: %d\n",number,num);
		}
		else
			printf("Case %d: -1\n",number);
		
	}
	
	
	
	return 0;
}

 

 

 

 

  • 大小: 11.8 KB
  • 大小: 9.3 KB
1
0
分享到:
评论

相关推荐

    POJ1328-Radar Installation

    这个题目要求参赛者解决一个雷达安装的问题,可能涉及到算法设计、空间几何理解以及高效的代码实现。 【描述】"解题报告+AC代码"表明该压缩包内容包括了解决该问题的思路分析(解题报告)以及通过了系统测试的源...

    北大POJ初级-基本算法

    5. **贪心算法**:对于一些局部最优的选择可以导致全局最优解的问题,如霍夫曼编码、Prim算法和Kruskal算法等。 6. **图论算法**:包括图的遍历(深度优先搜索和广度优先搜索)、最短路径问题(Dijkstra算法、Floyd...

    POJ2002-Squares

    总的来说,"POJ2002-Squares"是一个结合了数学、算法和编程实践的学习资源,对于提升编程技能和解决问题的能力非常有帮助。通过深入研究解题报告和AC代码,可以学习到如何有效地处理和求解这类问题,从而在未来的...

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    解题报告通常会涵盖问题分析、算法设计、代码实现和可能的优化等方面。 标签“POJ3253 POJ3253-Fence Repair STL 优先队列”进一步强调了这个编程问题与POJ3253编号相关,问题核心在于修复栅栏,而解决方法采用了...

    北大POJ初级-图算法

    【北大POJ初级-图算法】是一系列针对北京大学在线编程平台POJ(Problem Online Judge)上的初级编程题目,重点在于图论算法的应用。这个解题报告集合了多种图算法的实现,帮助学习者掌握如何在实际问题中运用这些...

    北大POJ中级-基本算法

    贪心算法可以解决活动选择问题、区间调度问题等。 通过解题实践,我们可以不断磨练编程技能,提升算法思维。在解决每个问题时,要尝试从多个角度思考,寻找最简洁、高效的解决方案。同时,注意代码的可读性和可维护...

    POJ1426-Find The Multiple【BFS+同余模】

    【标题】"POJ1426-Find The Multiple【BFS+同余模】"是一道来源于北京大学在线编程平台POJ的算法题目,主要涉及到了广度优先搜索(BFS)与同余模运算的知识点。这道题目要求解决的是寻找一个整数的倍数问题,可能...

    POJ1129-Channel Allocation【四色定理】

    3. "POJ1129-Channel Allocation.doc":这可能是一个Word文档,包含了详细的解题报告,包括问题分析、算法设计、代码实现和可能的优化策略。 在这个题目中,参赛者可能需要将一个网络中的电台(或频道)分配到有限...

    POJ3020-Antenna Placement

    解决这类问题可能需要用到搜索算法(如深度优先搜索、广度优先搜索)、动态规划、贪心策略,甚至是数学建模。具体解题策略则需要查看解题报告和源代码才能得知。 总的来说,这个压缩包提供了从问题理解到解决方案的...

    POJ 1129-Channel Allocation 的贪心算法解法(图的m着色问题)

    标题“POJ 1129-Channel Allocation”的问题是一个典型的图论问题,涉及到贪心算法和图的m着色问题。在这个问题中,我们假设有一个通信网络,其中的节点代表基站,每个基站需要分配一个频道来传输信号,而两个相邻的...

    poj 1000 - 2000 部分题目 官方分类

    在POJ的题目中,贪心策略常用于解决资源分配、任务调度等问题。 6. **回溯与分支限界**:这类题目涉及到深度优先搜索和广度优先搜索,以及如何有效地剪枝来避免无效计算。 7. **图算法**:图论是计算机科学中的一...

    POJ1258-Agri-Net【Prim】

    普里姆算法是一种贪心算法,它从一个顶点开始,逐步扩展最小生成树,每次添加一条与当前生成树连接且权值最小的边。以下是算法的基本步骤: 1. 初始化:选择图中的任意一个顶点作为初始最小生成树的一部分。 2. 建立...

    POJ1010-STAMPS

    【描述】"北大POJ1010-STAMPS"解题报告+AC代码,意味着这是一个关于如何解决这个特定问题的详细解答,包含了问题分析、算法设计以及通过测试(Accepted,通常缩写为AC)的源代码。解题报告通常会包含问题背景、输入...

    POJ1837-Balance

    1. "POJ1837-Balance.cpp":这是使用C++语言编写的源代码文件,其中包含了解决"POJ1837-Balance"问题的算法和程序。通过阅读代码,我们可以了解具体的编程实现细节,如数据结构的选择、算法流程、变量定义等。 2. ...

    POJ3414-Pots

    可能涉及排序、搜索、动态规划、贪心算法等经典方法。对于“Pots”问题,可能需要对 pots 进行有效的管理和操作,以达到某种最优目标。 4. **代码实现**:AC代码是指“Accepted”代码,即已经通过了所有测试用例的...

    POJ3259-Wormholes【Bellman】

    "POJ 3259 Wormholes Bellman"中的"POJ 3259"指定了问题在POJ系统中的编号,"Wormholes"是题目的主题,可能是虚拟的虫洞或者在网络、图论中的某种特殊连接,而"贝尔曼"则明确指出解决这个问题需要用到的算法是贝尔曼...

    POJ1201-Intervals

    代码中可能会用到动态规划、贪心算法等策略,以求在满足题目要求的同时,保证算法的时间复杂度尽可能低,从而在POJ平台上获得AC状态。而解题报告则会详细解释这些算法的应用和选择原因,以及代码的具体实现细节。

    POJ2503-Babelfish

    2. "POJ2503-Babelfish.doc":这可能是一个Microsoft Word文档,通常用于存储解题报告,包括问题解析、算法设计、代码解释、运行结果以及可能的优化建议等。 结合这些信息,我们可以推测"POJ2503-Babelfish"可能是...

    POJ1003-Hangover

    根据题目"POJ1003-Hangover"的特性,我们可以推测这可能是一个涉及数据结构、算法或者数学逻辑的问题。在实际的解题过程中,参赛者可能需要理解题目的具体要求,例如处理输入输出、解决特定的计算问题或者设计有效的...

Global site tag (gtag.js) - Google Analytics