首页 > 其他分享 >249: 凸包面积

249: 凸包面积

时间:2024-11-16 16:50:02浏览次数:3  
标签:逆时针 int 面积 栈顶 凸包 排序 249 size

解法:

使用Andrew算法【计算几何/凸包】安德鲁算法(Andrew's Algorithm)详解_andrew算法求凸包-CSDN博客

  1. 排序

    • 将所有点按照x坐标进行升序排序。如果x坐标相同,则按照y坐标升序排序。
  2. 初始化栈

    • 使用一个栈(或数组)s来存储凸包上的点,初始时为空。
  3. 构建下凸包

    • 从左至右遍历排序后的点集。
    • 对于每个点,检查栈顶的两个点和当前点是否构成逆时针方向的转向(即叉积是否为正)。
    • 如果不构成逆时针方向,从栈中弹出栈顶点,直到栈顶只剩下两个点或者当前点与栈顶两个点构成逆时针方向。
    • 将当前点压入栈。
  4. 构建上凸包

    • 从右至左遍历排序后的点集。
    • 类似于构建下凸包的过程,检查栈顶的两个点和当前点是否构成逆时针方向的转向。
    • 如果不构成逆时针方向,从栈中弹出栈顶点,直到栈顶只剩下两个点或者当前点与栈顶两个点构成逆时针方向。
    • 将当前点压入栈。
  5. 合并凸包

    • 由于下凸包和上凸包在最左端点和最右端点处重叠,需要去除重复的点。
    • 合并下凸包和上凸包(除去重叠部分)得到完整的凸包。

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3;
struct P{
	int x,y;
}p[N];
int n;
bool cmp(P a,P b){
	if (a.x!=b.x){
		return a.x<b.x;
	}else{
		return a.y<b.y;
	}
}
double cross(P o,P a,P b){
	return (a.x-o.x)*(b.y-o.y)-(a.y-o.y)*(b.x-o.x);
}
void Andrew(){
	sort(p,p+n,cmp);
	vector<P> s;
	for (int i=0;i<n;i++){
		while (s.size()>=2&&cross(s[s.size()-2],s[s.size()-1],p[i])<=0){
			s.pop_back();
		}
		s.push_back(p[i]);
	}
	int t=s.size();
	for (int i=n-1;i>=0;i--){
		while (s.size()>=1+t&&cross(s[s.size()-2],s[s.size()-1],p[i])<=0){
			s.pop_back();
		}
		s.push_back(p[i]);
	}
	double area=0;
	for (int i=0;i<s.size()-2;i++){
		area+=cross(s[0],s[i],s[i+1]);
	}
	printf("%.1lf\n",abs(area)/2);
}
int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>n;
		for (int i=0;i<n;i++){
			cin>>p[i].x>>p[i].y;
		}
		Andrew();
	}
	return 0;
}

标签:逆时针,int,面积,栈顶,凸包,排序,249,size
From: https://blog.csdn.net/2302_79277225/article/details/143697621

相关文章

  • 最大岛屿面积
    DFS解法classSolution:dir=[(-1,0),(1,0),(0,-1),(0,1)]defdfs(self,grid,x,y):ifx<0orx>=len(grid)ory<0ory>=len(grid[0])orgrid[x][y]!=1:return0grid[x][y]=0ans=1fo......
  • java计算二个四边形的重贴面积
    判断rect2在rect1上重贴面积publicbooleancalculateAreas(TbCusCameraRecognitionAreasrect1,TbCusCameraRecognitionAreasrect2){if(rect1==null||rect2==null){returntrue;}try{doublep1_x=Do......
  • 每日一题:https://www.luogu.com.cn/problem/P2249
    includeusingnamespacestd;intmain(){intp,sum;cin>>p>>sum;intarr[p];for(inti=0;i<p;i++){cin>>arr[i];}for(inti=1;i<=sum;i++){intmubiao;intmin=0;intmax=p-1;cin>>mubiao;for(;......
  • 每日一题 :https://www.luogu.com.cn/problem/P2249
    includeusingnamespacestd;intmain(){intp,sum;cin>>p>>sum;intarr[p];for(inti=0;i<p;i++){cin>>arr[i];}for(inti=1;i<=sum;i++){intmubiao;intmin=0;intmax=p-1;cin>>mubiao;for(;;){if(arr[0]mubiao){printf(......
  • 点云学习笔记17——PCL保存提取到的二维点云边界(即凸包边界)
    #include<pcl/io/pcd_io.h>#include<pcl/io/ply_io.h>#include<pcl/point_types.h>#include<pcl/features/normal_3d.h>#include<pcl/filters/project_inliers.h>#include<pcl/segmentation/sac_segmentation.h>#include<......
  • 关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截
    关于电线平方数(截面积)与功率之间关系的对比表格。该表格主要基于电流承载能力(导线的截面积)与相应的功率传输能力。电线截面积(mm²)额定电流(A)适用功率(W) (220V电压)适用功率(W) (380V电压)0.5mm²5A1100W1900W0.75mm²8A1760W30......
  • 用Python计算栅格数据的真实面积
    用Python计算栅格数据的真实面积在地理空间分析中,栅格数据的像素值通常代表某种属性,比如土地利用比例、植被覆盖率等。这些数据往往基于经纬度网格表示的比例值,而为了更直观地理解这些数据的空间意义,我们需要将这些比例值转化为实际面积(如平方米或公顷)。对于高分辨率的大尺寸栅......
  • 农经权中如何利用地块信息表、家庭成员表、合同面积表生成公示表
    农经权确权过程中要收集很多信息,最重要的信息为每户有多少块地,这户又有多少人来着。在村里公示的时候,不仅要有图纸公示位置,而且要有对应的表格看公示信息。然而存在一个问题,一户的地块数跟家庭成员数量不会有对应关系,用excel表格处理,没法做到将地块表与家庭成员表结合到一块。......
  • 题解:P11249 [GESP202409 七级] 小杨寻宝
    题目显然等价于问所有宝箱是否在一条链上。稍微转化一下题意,即我们现在要找到一条链,使得这条链上有宝物的节点数量尽可能多。想到这里我们发现这个和树的直径比较相似,那么我们直接大胆将深度定义为从根到这个节点上有宝箱节点的数量,然后做一遍树的直径。最后判断直径长度是否等......
  • 249 旅行商
    /*http://oj.daimayuan.top/course/5/problem/249蜗蜗的世界里有n个城市,城市两两之间通过高速公路连接,从第i个城市走到第j个城市需要花费ai,j的时间。现在蜗蜗想从1号城市出发旅游,他想把每个城市都玩个遍,但又不想在一个城市玩两遍,玩完以后蜗蜗需要回到1......