贪心算法_POJ1328和POJ2586小结

POJ1386链接http://poj.org/problem?id=1386
题意就是说给定小岛坐标,给出雷达覆盖范围,求出雷达最小个数
我们发现除却岸边到雷达的y轴距离大于覆盖半径r之外,总是可以与海岸线有一个或者两个交点,我们可以使用一个结构体(含有连个double类型的变量来进行存储)

于是原题目就变成了关于线段的最小重叠问题了,我们的贪心策略也很简单 :

首先:
1>对结构体按照left大小进行排序
2>判断当前temp.right>line[i].right时,直接令temp=line[i],进行转移,如果temp.right<line[i].left时表明雷达够不着了,所以雷达数量++,再转移当前对象temp=line[i], 最后有的同学会问:为啥不考虑temp[right]>line[i].left&&tmep.right<line[i].right呢?问得好!!!(自问自答,鼓掌!!!),因为我们当前使用的雷达只要在lne[i].left到temp.right之间就好了,后面加入的线段因为line[i+1].left>line[i].left,所以肯定不会到前面去,直到跳转到第二种情况:temp.right<line[i].left.

献上代码:

#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstdlib> 
/*
	这道题目本质上是对于线段重叠问题,这是一种很经典的贪心算法的思想:
		1.根据元素left排序,选择标志结构体,每一次比较只会有三种情况
			1>temp.rihgt>p[i].left 		,对于第一种情况其实不用进行操作,因为后面的left值一定是大于前面的left的值,只要最后没有超过temp.right的界限,最终都是可以使用一个雷达来锚定这个位置 
			2>temp.right>p[i].right 
			3>temp.right<p[i].left 
*/ 

typedef struct Line{
   
	double left;
	double right;
}Line;
/** 
bool cmp(Line a,Line b)
{
	return a.left<b.left;			//从小到大排序 
}
*/
void sort_(Line* a,int land_count)
{
   
	Line temp;
	for(int i=0;i<land_count;++i)
	{
   
		for(int j=i+1;j<land_count;++j)
		{
   
			if(a[i].left>a[j].left)
			{
   
				a[i]=temp;
				temp=a[j];
				a[j]=temp;	
			}
		}
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shallow_Carl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值