P2742 【模板】二维凸包 / [USACO5.1]圈奶牛Fencing the Cows (凸包)

题目思路正解:凸包洛谷链接这一题是凸包裸题,在这里我使用了Graham算法(时间复杂度为O(NlogN):大致思路即为以Y轴为第一关键字、X轴第二关键字排序,排完序后比较下一条边与这条边的斜率(相对于X为0时的横轴,越小越好),因为斜率越小就能包住更多的点。程序中对点位置的存储的设计(需要用struct):struct Unsigned{ double NumX,NumY;//注意这里是...
摘要由CSDN通过智能技术生成

题目思路正解:Graham算法

洛谷链接
这一题是凸包裸题,在这里我使用了Graham算法(时间复杂度为O(NlogN):大致思路即为以Y轴为第一关键字、X轴第二关键字排序,排完序后比较下一条边与这条边的斜率(相对于X为0时的横轴,越小越好),因为斜率越小就能包住更多的点(对于初学者来说有点难懂,下面会进一步地解释)。

程序中对点位置的存储的设计以及排序(需要用struct):

struct Unsigned{
	double NumX,NumY;//注意这里是double
	friend bool operator <(Unsigned Num1,Unsigned Num2){
		if(Num1.NumY==Num2.NumY)
			return Num1.NumX<Num2.NumX;
		return Num1.NumY<Num2.NumY;
		//边的比较(纵轴为第一关键字,横轴为第二关键字)
	}
}Bag[10100];
……
sort(Bag+1,Bag+1+N);

按这样排序后下图的点遍历的顺序便是ABCDEFGH:
在这里插入图片描述

在程序中,我们将凸包分为上下两部分,分别计算出上下两块的总长度,合起来就是答案了。

如图(绿线为上部分的线,蓝线为下部分的线,黄色是点,答案就是绿线加上蓝线的长度和):

在这里插入图片描述

计算下部分的总长,就要选择一条相对于X为0的主轴的斜率最小(上部分恰恰相反)的一条边。

如图(假设这是在计算凸包的

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值