249: 凸包面积

解法:

使用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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916663.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于VUE实现语音通话:边录边转发送语言消息、 播放pcm 音频

文章目录 引言I 音频协议音频格式:音频协议:II 实现协议创建ws对象初始化边录边转发送语言消息 setupPCM按下通话按钮时开始讲话,松开后停止讲话播放pcm 音频III 第三库recorderplayer调试引言 需求:电台通讯网(电台远程遥控软件-超短波)该系统通过网络、超短波终端等无线…

【Rust中的项目管理】

Rust中的项目管理 前言Package&#xff0c;Crate&#xff0c;Module &use &#xff0c;Path通过代码示例解释 Crate&#xff0c;Module &#xff0c;use&#xff0c;Path创建一个package&#xff1a;代码组织化skin.rs 中的代码struct & enum 相对路径和绝对路径引用同…

极客争锋 智连未来 TuyaOpen Framework极客创意大赛正式开启

TuyaOpen Framework极客创意大赛正式开启 可选择基于: TuyaOpen Framework 原生开源包: https://github.com/tuya/tuyaopen 支持 Ubuntu/T2/T3/T5/ESP32/ESP32C3等多款芯片TuyaOpen Arduino:https://github.com/tuya/arduino-tuyaopen支持 T2/T3/T5等多款芯片TuyaOpen LuaNode…

安装SQL server中python和R

这两个都是编程语言 R 是一种专门为统计计算和数据分析而设计的语言&#xff0c;它具有丰富的统计函数和绘图工具&#xff0c;常用于学术研究、数据分析和统计建模等领域。 Python 是一种通用型编程语言&#xff0c;具有简单易学、语法简洁、功能强大等特点。它在数据科学、机…

A029-基于Spring Boot的物流管理系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600…

理解HTTP中的Cookie与Session:机制、安全性与报头响应

文章目录 1. HTTP Cookie1.1. HTTP Cookie 工作流程1.2. Cookie 分类1.3. 安全性主要用途 2. Set-Cookie 报头2.1. Set-Cookie 格式2.2. 生命周期 3. HTTP Session3.1. 工作流程3.2. 安全性3.3. 超时 与 失效3.4. 用途 1. HTTP Cookie HTTP Cookie&#xff08;也称为 Web Cook…

【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉”

【电脑】解决DiskGenius调整分区大小时报错“文件使用的簇被标记为空闲或与其它文件有交叉” 零、报错 在使用DiskGenius对磁盘分区进行调整时&#xff0c;DiskGenius检查出磁盘报错&#xff0c;报错信息&#xff1a;文件使用的簇被标记为空闲或与其它文件有交叉&#xff0c;…

redis linux 安装

下载解压 https://download.redis.io/releases/ tar -zvxf ----redis-7.4.1编译 进入目录下 # redis 依赖c yum install gcc-cmake可能会有问题&#xff0c;所以记得换源# 安装到 /usr/local/redis make PREFIX/usr/local/redis installcd src ./redis-serverredis.confi…

TG2016SLN爱普生38.400000MHz温度补偿振荡器X1G005731070216

在电子电路系统中&#xff0c;频率如同心脏跳动的节奏&#xff0c;为整个系统的有序运行提供基本节拍。38.4MHz 这个频率在众多电子应用场景中有广泛的用途。在数字电路领域&#xff0c;它可以作为时钟信号&#xff0c;为微处理器、微控制器等核心芯片提供稳定的工作频率&#…

LabVIEW 实现 find_nearest_neighbors 功能(二维平面上的最近邻查找)

1. 背景介绍 在数据分析和图像处理领域&#xff0c;经常需要查找给定点的最近邻居点。在LabVIEW中&#xff0c;计算二维平面上多个点之间的欧氏距离&#xff0c;并返回距离最近的几个点是一种常见操作。find_nearest_neighbors 函数用于实现这个功能。 2. 欧氏距离计算 在二维…

【Rust 编程语言工具】rustup-init.exe 安装与使用指南

rustup-init.exe 是用于安装和管理 Rust 编程语言工具链的 Windows 可执行文件。Rust 是一种系统级编程语言&#xff0c;旨在提供安全、并发和高性能的功能。rustup-init.exe 是官方提供的安装器&#xff0c;用于将 Rust 安装到 Windows 操作系统中&#xff0c;并配置相关环境。…

道陟科技EMB产品开发进展与标准设计的建议|2024电动汽车智能底盘大会

11月12日&#xff0c;2024电动汽车智能底盘大会在重庆开幕。会议由中国汽车工程学会主办&#xff0c;电动汽车产业技术创新战略联盟、中国汽车工程学会智能底盘分会、智能绿色车辆与交通全国重点实验室承办。本届大会围绕电动汽车智能底盘相关技术发展与融合&#xff0c;满足高…

【RabbitMQ】09-取消超时订单

生产者完成创建订单和扣减库存之后&#xff0c;发送消息到延迟队列。 // 3.清理购物车商品cartClient.deleteCartItemByIds(itemIds);// cartService.removeByItemIds(itemIds);// 4.扣减库存try {itemClient.deductStock(detailDTOS);//itemService.deductStock(detailDTOS);…

新版Apache tomcat服务安装 Mac+Window双环境(笔记)

简介&#xff1a;Tomcat服务器器的下载和安装&#xff1a; 安装前提 1&#xff09;电脑需要有java环境&#xff0c;jdk8以上&#xff0c;否则启动不不成功 2&#xff09;已经安装Sublime⽂文件编辑软件 3&#xff09;window电脑需要显示⽂文件拓拓展名 官网&#xff08;https:…

【数据结构与算法】查找

文章目录 一.查找二.线性结构的查找2.1顺序查找2.2折半查找2.3分块查找 三.树型结构的查找3.1二叉排序树1.定义2.二叉排序树的常见操作3.性能分析 3.2平衡二叉树1.定义2.平衡二叉树的常见操作3.性能分析 3.3B树1.定义2.B树的相关操作 3.4B树1.定义2.B树与B树的比较 四.散列表4.…

人工智能:塑造未来的工作与生活

目录 人工智能技术的应用前景与影响 人工智能的历史与现状 人工智能的应用领域 人工智能的前景与挑战 个人视角&#xff1a;人工智能的应用前景与未来 人工智能在生活中的潜力 面对人工智能带来的挑战 我的观点与建议 结语 人工智能技术的应用前景与影响 随着人工智能…

electron安装遇到的问题

在安装electron时&#xff0c; 我开始使用的是 git clone 命令安装的&#xff0c;之后进入文件夹再 npm install 就可以了&#xff0c;但是中间会出现问题&#xff0c; 安装的时候卡在 node install.js 命令行那里 git clone https://github.com/electron/electron-quick-star…

ADC输出码和输入电压转换关系

ADC输出码和输入电压转换关系 转换公式&#xff1a;ADC输出码(Vin / Vref) *2n 。其中Vin 是输入ADC芯片的电压&#xff0c;Vref是参考电压&#xff0c;n是ADC芯片的位数。 举个例子MS5182是一个16bit的ADC&#xff08;21665536&#xff09;&#xff0c;参考电压Vref4.096V&a…

Leecode刷题C语言之最少翻转次数使二进制矩阵回文①

执行结果:通过 执行用时和内存消耗如下&#xff1a; 题目&#xff1a;最少翻转次数使二进制矩阵回文① 给你一个 m x n 的二进制矩阵 grid 。如果矩阵中一行或者一列从前往后与从后往前读是一样的&#xff0c;那么我们称这一行或者这一列是 回文 的。你可以将 grid 中任意格子…

【JavaScript】JavaScript开篇基础(6)

1.❤️❤️前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ 亲爱的朋友们&#x1f44b;&#x1f44b;&#xff0c;这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章&#xff0c;请别吝啬你的点赞❤️❤️和收藏&#x1f4d6;&#x1f4d6;。如果你对我的…