C++/PTA 神坛

news2024/10/6 18:28:27

C++/PTA 神坛

    • 题目要求
    • 解题前提及思路
      • 凹包算法
        • 概念
        • 步骤
      • 解题思路
    • 代码
      • tan(y/x)及tan2(y,x)函数
    • 总结

题目要求

在古老的迈瑞城,巍然屹立着 n 块神石。长老们商议,选取 3 块神石围成一个神坛。因为神坛的能量强度与它的面积成反比,因此神坛的面积越小越好。特殊地,如果有两块神石坐标相同,或者三块神石共线,神坛的面积为 0.000。

长老们发现这个问题没有那么简单,于是委托你编程解决这个难题。

输入格式:
输入在第一行给出一个正整数 n(3 ≤ n ≤ 5000)。随后 n 行,每行有两个整数,分别表示神石的横坐标、纵坐标(−109≤ 横坐标、纵坐标 <109)。

输出格式:
在一行中输出神坛的最小面积,四舍五入保留 3 位小数。

输入样例:
8
3 4
2 4
1 1
4 1
0 3
3 0
1 3
4 2

输出样例:
0.500

样例解释:
输出的数值等于图中红色或紫色框线的三角形的面积。
在这里插入图片描述


解题前提及思路

该程序可归类为计算平面内点集的最小面积的凸包

凹包算法

概念

定义:对于平面内的一组点,凸包是指这组点的凸多边形中,所有的顶点都是这组点中的点的集合。

凸包(Convex Hull)算法是一种计算二维平面点集最小凸多边形的算法。而凸多边形具有如下特征:在其内部的任意两点,连线都必须位于多边形内部。

因此,凹包(Concave Hull)问题就是将给定的点集包围在一个凹多边形中的算法。凹包问题的难点在于如何确定多边形的形状和顶点,目前已经存在一些解决方案,包括基于 alpha 型和 beta 型形态学的方法、基于分割重组的方法、基于斯蒂尔-沃森(Stiel-Watson)统计的方法等等。

步骤

先求出每个点的单位向量,根据单位向量在极坐标系下的极角从小到大排序,然后按照排序后的顺序依次加入点,如果当前点不是凸包上的点,则一直弹掉栈顶元素直到满足要求,最后栈内存储的就是凸包上所有的点了。

解题思路

  1. 用结构体存储平面内的点的坐标及其单位向量,以及该点的编号。

  2. 求出每个点的单位向量,并根据该向量的极角从小到大排序。

  3. 遍历排序后的点集,依次判断每个点是否在凸包上。如果是,将其入栈;否则,弹出栈顶元素直到满足凸包条件。

  4. 最后栈内存储的即为凸包上所有的点的编号。

  5. 根据这些点的坐标计算凸包的面积,具体方法是用两个相邻点和原点组成的三角形面积求和。


代码

#include<iostream>
#include<algorithm>
#include<cmath> 

using namespace std;

struct node {
    long long x, y; // 存储平面内的点的坐标
    int xiang; // 存储所在象限
};

int n;

bool cmp(node x,node y)
{
    // 判断两个点所在象限是否相同
    if(x.xiang != y.xiang)
        return x.xiang < y.xiang;
    // 如果所在象限相同,则判断它们组成的向量与 x 轴之间的夹角大小来排序,
    // 如果向量之间的叉积为正数,表明顺时针旋转需要交换两个向量的位置,这时
    // 我们认为前一个向量更小;如果叉积为负数,表明逆时针旋转不需要交换,这时
    // 认为后一个向量更小。
    return x.x * y.y - x.y * y.x < 0; 
}

// 判断点所在象限的函数
int judge(node x)
{
    if(x.x > 0 && x.y > 0) return 1;
    if(x.x < 0 && x.y > 0) return 2;
    if(x.x < 0 && x.y < 0) return 3;
    if(x.x > 0 && x.y < 0) return 4;
 }

int main()
{
    cin >> n;
    
    struct node a[5010], b[5010];
    for(int i = 1; i <= n; i++)
    {
        cin >> a[i].x >> a[i].y;
    }
    
    double s = -1;
    int cnt;

    for(int i = 1; i <= n; i++)
    {
        cnt = 1;
        for(int j = 1; j <= n; j++)
        {
            if(i == j) continue;
            b[cnt].x = a[j].x - a[i].x;
            b[cnt].y = a[j].y - a[i].y;
            b[cnt].xiang = judge(b[cnt]);
            cnt++;
        } 

        sort(b + 1, b + n, cmp); // 排序

        for(int j = 1; j < n - 1; j++)
        {
            // 计算三角形面积,求最小值
            if(s == -1 || fabs(b[j + 1].x * b[j].y - b[j + 1].y * b[j].x) * 0.5 < s)
                s = fabs(b[j + 1].x * b[j].y - b[j + 1].y * b[j].x) * 0.5;
        }
    }

    printf("%.3f\n", s);
    return 0;
} 

 } 

需要注意的是,在计算向量的极角时,可以用 atan2(y, x) 函数,而不是简单地使用 arctan(y/x),这是因为 atan2 函数会根据 y 和 x 的符号自动确定向量在哪个象限,避免了分段计算的麻烦。


tan(y/x)及tan2(y,x)函数

tan(y, x) 函数表示求以 (x, y) 为起点的射线与 x 轴正方向之间的夹角的正切值。在求解过程中,需要使用参数 y 和 x 分别代表这条射线在 y 方向和 x 方向上的长度。因此,tan 函数的返回值是一个实数类型。

atan2(y, x) 函数则是求以原点为起点的射线与 x 轴之间的夹角,其输入参数也是射线在 yx 方向上的长度。需要注意的是,atan2(y, x) 函数返回值的单位是弧度制,通常需要进行转换后才能得到以角度为单位的值。

atan2(y, x) 函数在计算以原点为起点的向量与 x 轴正方向所夹角度数时,会根据向量在平面上的位置自动确定向量所在的象限。

具体来说,如果向量位于第一象限,即其x和y坐标均为正数,
那么atan2(y, x)计算出的角度值将是 0 到 π/2 之间的一个正值。

如果向量位于第二象限,即其x坐标为负数,而y坐标为正数,
那么atan2(y, x)计算出的角度值将是 π/2 到 π 之间的一个正值。

另外,由于 tan(y, x) 中需要除以 x 的值,所以当 x 的值为 0 时会导致除数为 0 的错误。而 atan2(y, x) 可以避免这种错误的发生,因此更加常用。


总结

本文使用凹包算法atan2(y,x)函数进行解题,读者可躬身实践。
我是秋说,我们下次见。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

记录:自回归 模型在记忆 全随机序列 的潜变量 统计量爆炸现象

只是一个记录 8层12头512维度的 GPT 模型&#xff0c;使用它来记忆 10000 条 512长度 的无序序列&#xff0c;vocab_size 为100。 模型要自回归生成这些序列&#xff0c;不可能依赖局部推理&#xff0c;必须依赖全局视野&#xff0c;即记住前面的序列。 然后统计 最后一个no…

HF宣布在transformers库中引入首个RNN模型:RWKV,一个结合了RNN与Transformer双重优点的模型

RWKV是一个结合了RNN与Transformer双重优点的模型架构。由香港大学物理系毕业的彭博首次提出。简单来说&#xff0c;RWKV是一个RNN架构的模型&#xff0c;但是可以像transformer一样高效训练。今天&#xff0c;HuggingFace官方宣布在transformers库中首次引入RNN这样的模型&…

QGC局域网内连接PX4模拟器JMAVSim

环境 QGroundControl 开源地面站系统; 代码地址: https://github.com/mavlink/qgroundcontrolPX4 开源飞控系统; 代码地址: https://github.com/PX4/PX4-Autopilot QGC可以直接下载运行包. PX4 请根据代码中的说明,进行环境的配置和运行. 通过代码去build地面站和PX4的步骤见官…

【Linux 之五】 Linux中使用fdisk命令实现磁盘分区

最近由于工作的需要&#xff0c;初步研究了uboot中的fastboot实现方式。研究fastboot不可避免的需要了解磁盘分区的相关知识点&#xff0c;在linux下可以使用fdisk命令实现磁盘的分区。好了&#xff0c;下面步入正题。 1. 查看帮助信息&#xff08;fdisk --help&#xff09; …

计算机网络 - 传输层

Transport-Layer Services Transport layer, 传输层主要是完成进程(proces)到进程(process)之间的通讯的. 在传输层之下的IP协议, 提供的是best-effort的传输, 也就是对信息的正确性没有保证, 也就是IP的协议是unreliable的, TCP的协议是在IP协议至少提供可靠的数据传输. UDP…

Word批量更改图片环绕方式与=尺寸大小

前提&#xff1a;一份Word文档里面有100张图片&#xff0c;有大有小&#xff0c;需要将100张图片更改为统一大小&#xff0c;宽度与高度均为5厘米&#xff0c;同时环绕方式也需要改成四周型。 默认Word图片的默认环绕方式为嵌入型&#xff0c;需要统一更改为四周型&#xff0c;…

多元时间序列 | RBF径向基神经网络多变量时间序列预测(Matlab完整程序)

多元时间序列 | RBF径向基神经网络多变量时间序列预测(Matlab完整程序) 目录 多元时间序列 | RBF径向基神经网络多变量时间序列预测(Matlab完整程序)预测结果评价指标基本介绍程序设计参考资料预测结果 评价指标 训练集数据的R2为:0.99805 测试集数据的R2为:0.98351 训练…

二叉树最大宽度_深度优先方式_20230520

二叉树最大宽度_深度优先方式_20230520 前言 给定一颗二叉树&#xff0c;求解其最大宽度。定义每层宽度为该层最左和最右之间的长度&#xff0c;也即左右两个端点之间的所跨越的长度&#xff0c;两个端点直接可能会包含一些延伸到本层的空节点&#xff0c;这些空节点的长度由…

【小沐学NLP】Python实现聊天机器人(OpenAI,模型概述笔记)

&#x1f37a;NLP开发系列相关文章编写如下&#x1f37a;&#xff1a;1&#x1f388;【小沐学NLP】Python实现词云图&#x1f388;2&#x1f388;【小沐学NLP】Python实现图片文字识别&#x1f388;3&#x1f388;【小沐学NLP】Python实现中文、英文分词&#x1f388;4&#x1…

Springcloud1----->Hystrix

目录 雪崩问题服务降级原理实践order降级处理user降级处理 服务熔断原理实践 hystrix&#xff0c;英文意思是豪猪&#xff0c;全是是刺&#xff0c;一种保护机制&#xff0c;即熔断器。 主页&#xff1a;https://github.com/Netflix/Hystrix/ 雪崩问题 在微服务中&#xff0c;…

selenium自动化测试报告_selenium自动化测试断言

一、元素操作方法 方法&#xff1a; 1、.send_keys() # 输入方法 2、.click() # 点击方法 3、.clear() # 清空方法 复制 注意&#xff1a;在输入方法之前一定要清空操作!! # 导包 from time import sleep from selenium import webdriver# 实例化浏览器 driver webdriver…

这才是自动化测试,资深测试构建持续交付体系(高质量)持续集成...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试-自动化测…

OptimizePI仿真流程

OptimizePI软件介绍 OptimizePI是用于针对PI设计进行优化的一个设计流程&#xff0c;可以针对PDN的设计进行仿真计算&#xff0c;主要功能包括以下几个&#xff1a; PDN前仿真分析PDN后仿真分析PDN阻抗检查去耦电容的回路电感分析芯片的电源管脚的电感分析去耦电容最佳位置评…

一文参透AB斗篷的前世今生

做FP独立站的应该都对cloak斗篷不陌生&#xff0c;cloak已经成为出海营销行业的必备工具之一。尽管使用cloak并不能保证一定有效&#xff0c;但不使用cloak却也是不可行的。今天本文将详细讲解cloak系统的“前世今生”&#xff0c;以便让大家更好地了解cloak系统并能挑选到最适…

【中间件】通过 docker-compose 快速部署 Zookeeper 保姆级教程

文章目录 一、概述二、前期准备1&#xff09;部署 docker2&#xff09;部署 docker-compose 三、创建网络四、Zookeeper 编排部署1&#xff09;下载 Zookeeper2&#xff09;配置3&#xff09;启动脚本 bootstrap.sh4&#xff09;构建镜像 Dockerfile5&#xff09;编排 docker-c…

如何使用ChatGpt来学习和提问【对话ChatGPT】?

ChatGPT的不断发展和进步&#xff0c;我们需要工作中很多时候会用到ChatGPT&#xff0c;那么如何使用ChatGPT来解决我们工作中的问题呢&#xff1f; Q1如何向ChatGPT提问&#xff0c;从而更快解决我们的问题&#xff1f; ChatGPT&#xff1a;以下是向ChatGPT提问的一些提示&a…

CISSP和Security+的区别和学习建议

当谈到网络安全认证时&#xff0c;经常有朋友问我CISSP 与 Security认证。两者都是业内比较认可&#xff0c;对实际工作有所帮助的认证&#xff0c;但是哪一个适合自己呢&#xff0c;区别又是什么呢&#xff1f; 在深入研究细节之前&#xff0c;让我们先简要了解一下 CISSP 与 …

深度学习之自编码器实现——实现图像去噪

大家好&#xff0c;我是带我去滑雪&#xff01; 自编码器是一种无监督学习的神经网络&#xff0c;是一种数据压缩算法&#xff0c;主要用于数据降维和特征提取。它的基本思想是将输入数据经过一个编码器映射到隐藏层&#xff0c;再通过一个解码器映射到输出层&#xff0c;使得输…

数字宁夏“1244+N”行动进行时,实在智能以AI为宁夏全区县数字化转型加“数”度

建设数字中国是数字时代推进中国式现代化的重要引擎&#xff0c;是构筑国家竞争新优势的有力支撑。现如今&#xff0c;政府部门发展数字经济已然成为新科技浪潮下的战略选择。可以预见&#xff0c;在数字化浪潮的推动下&#xff0c;中国经济将迎来新的高峰。 近日&#xff0c;宁…