首页 > 其他分享 >[学习笔记] 凸包

[学习笔记] 凸包

时间:2023-08-08 21:47:00浏览次数:33  
标签:return int tot 凸包 学习 stu 笔记 include

凸包

由于 \(Andrew\) 算法较快,所以主要介绍 \(Andrew\) 的实现方式

我们把输入按照 \(x\) 为第一关键字,\(y\) 为第二关键字进行从小到大排序,保证了 \(1\) 和 \(n\) 两个端点把凸包分成了两个部分(称为凸壳),从 \(1\) 遍历到 \(n\) 再从 \(n\) 遍历到 \(1\) ,把遍历到的点压入栈,使用叉积可以判断栈中点的相对位置,使栈中点只能向左偏离,这样就能找到凸包。

P2742 [USACO5.1]【模板】二维凸包)

code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
int n;
int stu[100010],tot;
bool v[100010];
double ans;
struct node{
    double x,y;
}a[100010];
bool cmp(node x,node y){
    if(x.x!=y.x) return x.x<y.x;
    return x.y<y.y; 
}
bool check(){
    double a1=a[stu[tot]].x-a[stu[tot-2]].x;
    double b1=a[stu[tot]].y-a[stu[tot-2]].y;
    double a2=a[stu[tot-1]].x-a[stu[tot-2]].x;
    double b2=a[stu[tot-1]].y-a[stu[tot-2]].y;
    double an=(a1*b2)-(a2*b1);
    if(an>=0) return 0;
    return 1;
}
double dis(int x,int y){
    return sqrt((a[x].x-a[y].x)*(a[x].x-a[y].x)+(a[x].y-a[y].y)*(a[x].y-a[y].y));
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lf%lf",&a[i].x,&a[i].y);
    }
    sort(a+1,a+n+1,cmp);
    stu[++tot]=1;
    stu[++tot]=2;
    for(int i=3;i<=n;i++){
        stu[++tot]=i;
        while(tot!=2&&!check()){
            stu[tot-1]=stu[tot];
            tot--;
        }
    }
    for(int i=2;i<=tot;i++){
        ans+=dis(stu[i],stu[i-1]);
        v[stu[i]]=1;
    }
    tot=0;
    stu[++tot]=n;
    stu[++tot]=n-1;
    for(int i=n-2;i>=1;i--){
        if(v[i]) continue;
        stu[++tot]=i;
        while(tot!=2&&!check()){
            stu[tot-1]=stu[tot];
            tot--;
        }
    }
    for(int i=2;i<=tot;i++){
        ans+=dis(stu[i],stu[i-1]);
    }
    printf("%.2lf",ans);
    return 0;
}

标签:return,int,tot,凸包,学习,stu,笔记,include
From: https://www.cnblogs.com/muzqingt/p/17615456.html

相关文章

  • PMP 学习笔记(八)
    07.25星期二缓冲只用于预测性项目,应对风险来用精益方法不留一丝丝的多余Moscow是排序工具成本效益分析是判断值不值得的工具投资汇报分析是判断值不值得的工具挣值分析是判断成本、进度、成本的工具项目经理应密切关注影响项目的内外部事业环境因素的变化替代也属于风险......
  • 渗透测试学习笔记
    渗透测试:渗透测试基本流程:确定目标:信息收集:是指通过各种方式获取所需要的信息,便于在后续渗透过程更好进行,例如目标站点IP、中间件、脚本语言、端口、邮箱······漏洞探测(手动/自动):漏洞分析:漏洞利用(手动/自动):信息整理:形成报告:......
  • redis初学习
    本文主要基于黑马的redis视频编写Redis是一种键值型的NoSql数据库,这里有两个关键字:键值型NoSql其中键值型,是指Redis中存储的数据都是以key.value对的形式存储,而value的形式多种多样,可以是字符串.数值.甚至json:redis入门NoSQLNoSql可以翻译做NotOnlySql(不仅仅是SQL),或者......
  • 《Java编程思想第四版》学习笔记07
    到底应该使用一个接口还是一个抽象类呢?若使用接口,我们可以同时获得抽象类以及接口的好处。所以假如想创建的基础类没有任何方法定义或者成员变量,那么无论如何都愿意使用接口,而不要选择抽象类。事实上,如果事先知道某种东西会成为基础类,那么第一个选择就是把它变成一个接口。只有在必......
  • openGauss学习笔记-34 openGauss 高级数据管理-SCHEMA
    openGauss学习笔记-34openGauss高级数据管理-SCHEMASCHEMA又称作模式。通过管理SCHEMA,允许多个用户使用同一数据库而不相互干扰,可以将数据库对象组织成易于管理的逻辑组,同时便于将第三方应用添加到相应的SCHEMA下而不引起冲突。每个数据库包含一个或多个SCHEMA。数据库中的每个......
  • tesserocr笔记
    tesserocr安装教程pipinstalltesserocr出错:tesserocrWHL下载whl安装方式:pipinstall文件名.whl报错“RuntimeError:FailedtoinitAPI,possiblyaninvalidtessdatapath:”修改路径为纯英文修改tesserocr环境变量......
  • 0807笔记
    1、精讲软硬链接硬链接软链接2、压缩和解压缩tar指定目录解压缩[root@c1day02]#tarzxvf/mnt/day02/day02.tar.gz-C/mnt/day02/yu/study1.txtstudy2.txtstudy3.txtstudy4.txtstudy5.txtstudy6.txtwork11/work22/work33/work44/work55/zip[root@c1day02]#......
  • JVM学习笔记2——垃圾回收GC
    三、垃圾回收 1.如何判断对象是否可以回收 ①引用计数法——早期python中使用当一个对象被引用时,就当引用对象的值加一,当值为0时,就表示该对象不被引用,可以被垃圾收集器回收。这个引用计数法听起来不错,但是有一个弊端,如下图所示,循环引用时,两个对象的计数都为1,导致两个对象......
  • JVM学习之:堆(Heap)和非堆(Non-heap)内存
    JVM学习之:堆(Heap)和非堆(Non-heap)内存 堆(Heap)和非堆(Non-heap)内存:堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来......
  • C学习2
    1、switch(整形表达式){case整形常量表达式:……;break:}2、每个case后面记得break3、default位置随便放前后都可以4、while语句里,break用于永久终止循环,continue用于终止当前循环回到判断入口5、注意清空输入缓冲区 6、几个重要的ASCII码:0(ASCII码十进制48),A(ASCII码十进制6......