题目思路正解: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的主轴的斜率最小(上部分恰恰相反)的一条边。
如图(假设这是在计算凸包的