POJ 1113 Wall(凸包周长)

c++算凸包周长 c++算凸包周长c++算凸包周长c++算凸包周长c++算凸包周长c++算凸包周长 立即下载

题目链接:POJ 1113 Wal

所求周长 = 凸包周长 + 半径为L的圆的周长。

这个我不会证明,我是画了一个圆的城堡,画了一个正方形的城堡,这两种都是满足上边的公式的,然后我认为这是两个极限,中间的都满足。或许三角形城堡才是一个极限吧。

我自己写了一个卷包裹法,然后又用了一下刘汝佳的模版,速度差了一半,算法的力量真的好强大。

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>

using namespace std;

const double eps = 1e-10;
const int MAX_N = 1000 + 10;
const double PI = acos(-1);

struct Point
{
	int x, y;
	Point(int x=0, int y=0):x(x),y(y) { }
};

typedef Point Vector;

Point p[MAX_N];

Vector operator + (const Vector& A, const Vector& B)
{
    return Vector(A.x+B.x, A.y+B.y);
}

Vector operator - (const Point& A, const Point& B)
{
    return Vector(A.x-B.x, A.y-B.y);
}

Vector operator * (const Vector& A, double p)
{
    return Vector(A.x*p, A.y*p);
}

bool operator < (const Point& a, const Point& b)
{
	return a.x < b.x || (a.x == b.x && a.y < b.y);
}

int dcmp(double x)
{
    if(fabs(x) < eps)
        return 0;
    else
        return x < 0 ? -1 : 1;
}

bool operator == (const Point& a, const Point &b)
{
	return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;
}

double Cross(const Vector& A, const Vector& B)
{
    return A.x*B.y - A.y*B.x;
}

double Dot(const Vector& A, const Vector& B)
{
    return A.x*B.x + A.y*B.y;
}

double Length(const Vector& A)
{
    return sqrt(Dot(A, A));
}
double dist(int a, int b)
{
    double x1, x2, y1, y2, res;
    x1 = p[a].x, x2 = p[b].x, y1 = p[a].y, y2 = p[b].y;
    res = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    return res;
}
int path[MAX_N];

int main()
{
    //freopen("in.txt", "r", stdin);
    int n, l;
    scanf("%d%d", &n, &l);
    int _minX = 10010, _minY = 10010, _start, _beg, _end, _size = 0;
    double dis = 0.0;
    for(int i = 0; i < n; i++)
    {
        scanf("%d%d", &p[i].x, &p[i].y);
        if(_minY > p[i].y || (_minY == p[i].y && _minX > p[i].x))
        {
            _start = i;
            _minY = p[i].y;
            _minX = p[i].x;
        }
    }
    _beg = _start;
    path[_size++] = _start;
    while(true)
    {
        _end = 0;
        for(int i = 0; i < n; i++)
        {
            if(Cross(p[i] - p[_beg], p[_end] - p[_beg]) > 0 ||
               ((Cross(p[i] - p[_beg], p[_end] - p[_beg]) == 0) &&
                dcmp(Length(p[i] - p[_beg]) - Length(p[_end] - p[_beg])) > 0))
                _end = i;
        }
        if(_end == _start) //卷到起点了
            break;
        path[_size++] = _beg = _end;
    }
    for(int i = 0; i < _size - 1; i++)
        dis += dist(path[i], path[i + 1]);
    dis += dist(path[_size - 1], path[0]);
    dis += 2 * PI * l;
    printf("%.0f\n", dis);
    return 0;
}

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

const double eps = 1e-10;
const double PI = acos(-1);
const int MAX_N = 1000 + 10;

struct Point
{
	int x, y;
	Point(int x=0, int y=0):x(x),y(y) { }
};

typedef Point Vector;

Point p[MAX_N];

Vector operator + (const Vector& A, const Vector& B)
{
    return Vector(A.x+B.x, A.y+B.y);
}

Vector operator - (const Point& A, const Point& B)
{
    return Vector(A.x-B.x, A.y-B.y);
}

Vector operator * (const Vector& A, double p)
{
    return Vector(A.x*p, A.y*p);
}

bool operator < (const Point& a, const Point& b)
{
	return a.x < b.x || (a.x == b.x && a.y < b.y);
}

int dcmp(double x)
{
    if(fabs(x) < eps)
        return 0;
    else
        return x < 0 ? -1 : 1;
}

bool operator == (const Point& a, const Point &b)
{
	return dcmp(a.x-b.x) == 0 && dcmp(a.y-b.y) == 0;
}

double Cross(const Vector& A, const Vector& B)
{
    return A.x*B.y - A.y*B.x;
}

double Dot(const Vector& A, const Vector& B)
{
    return A.x*B.x + A.y*B.y;
}

double Length(const Vector& A)
{
    return sqrt(Dot(A, A));
}

// 点集凸包
// 如果不希望在凸包的边上有输入点,把两个 <= 改成 <
// 如果不介意点集被修改,可以改成传递引用
vector<Point> ConvexHull(vector<Point> p)
{
  // 预处理,删除重复点
      sort(p.begin(), p.end());
      p.erase(unique(p.begin(), p.end()), p.end());

      int n = p.size();
      int m = 0;
      vector<Point> ch(n+1);
      for(int i = 0; i < n; i++) {
        while(m > 1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
        ch[m++] = p[i];
      }
      int k = m;
      for(int i = n-2; i >= 0; i--) {
        while(m > k && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-2]) <= 0) m--;
        ch[m++] = p[i];
      }
      if(n > 1) m--;
      ch.resize(m);
      return ch;
}

// 多边形的有向面积
double PolygonArea(vector<Point> p)
{
      double area = 0;
      int n = p.size();
      for(int i = 1; i < n-1; i++)
        area += Cross(p[i]-p[0], p[i+1]-p[0]);
      return area/2;
}
int n, l;

double get_dis(vector<Point> p)
{
    double dis = 0;
    int n = p.size();
    double x1, x2, y1, y2;
    for(int i = 0; i < n - 1; i++)
    {
        x1 = p[i].x, x2 = p[i + 1].x, y1 = p[i].y, y2 = p[i + 1].y;
        dis += sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    }
    x1 = p[n - 1].x, x2 = p[0].x, y1 = p[n - 1].y, y2 = p[0].y;
    dis += sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
    dis += 2 * PI * l;
    return dis;
}


double torad(double deg)
{
    return deg/180 * PI;
}
Vector Rotate(const Vector& A, double rad)
{
    return Vector(A.x*cos(rad)-A.y*sin(rad), A.x*sin(rad)+A.y*cos(rad));
}
int main()
{
    scanf("%d%d", &n, &l);
    vector <Point> P;
    int x, y;
    for(int i = 0; i < n; i++)
    {
        scanf("%d%d", &x, &y);
        P.push_back(Point(x, y));
    }
    printf("%.0f\n", get_dis(ConvexHull(P)));
    return 0;
}


保姆级教程:用vxe-grid给管理后台加个「智能筛选」功能(支持模糊搜索/多选/范围查询) 本文提供了一份详细的Vxe-Grid智能筛选功能实现教程。通过自定义筛选器渲染,文章逐步指导开发者为后台管理系统添加支持模糊搜索、多选下拉和数值范围查询的智能筛选功能,并分享了性能优化与移动端适配等实战经验。 阅读详情

相关推荐

UE5游戏逆向实战:用FModel提取.pak文件中的3D模型(附Dumper-7避坑指南)

本文详细介绍了在UE5游戏逆向工程中使用FModel提取.pak文件中3D模型的实战技巧,包括Dumper-7工具的深度配置与避坑指南。针对UE5特有的unversioned属性系统,提供了从源码编译到智能注入的全链路解决方案,帮助开发者高效获取游戏资产并优化处理流程。

weixin_30374009的博客 497

计算几何:凸包

极点:在一组点中,若沿着某一个点做直线,必然能找到一条直线使得所有点都在直线的另一侧,则这个点为极点。 凸包:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边形,它能包含点集中所有的点 平面的一个子集S被称为是“凸”的,当且仅当对于任意两点p,s∈S,线段ps都完全属于S。(平面凸包定义): 计算凸包: Graham扫描法: 复杂度O(nlog...

wangqianqianya的博客 916

python入门:Anaconda和Jupyter notebook的安装与使用

一、安装和使用Anaconda 1、anaconda是什么? Anaconda在英文中是“巨蟒”的意思,与python的意思相近,它是python的包管理器和环境管理器。 2、为什么需要安装anaconda? 原因有以下几点: 附带一大批常用的数据科学包,方便立即开始处理数据 管理包 anaconda是在conda(一个包管理器和环境管理器)上发展来的;而conda可以很方便地对第三方的包进行安装、卸载和更新。 管理环境 conda可以为不同的项目建立不同的运行环境,避免不同的项目或包版本

PY洋洋 1万+

【计算几何】【凸包周长】【思维】城墙

here 主要是看边界的情况,因为他说最边上的距离不能超过L这就意味着拐角处外面的城墙应该是属于弧状的。 这样最后的结果就会是凸包周长加上2ΠL2ΠL2ΠL 套一下板子就好了。 ac code #include <bits/stdc++.h> #include <iostream> #include<algorithm> #include <cstdio> #include <cmath> #define re register int #defi

peacesir的博客 239

【FPGA XDMA AXI Bridge 模式】PCIe:BARs 和 AXI:BARs 含义解析

Xilinx的 DMA/Bridge Subsystem for PCI Express IP核中,支持普通的XDMA模式,但是这种模式只允许主机端发起PCIe 读写请求,FPGA内部无法主动发起读写请求,也即FPGA无法主动读写HOST的内存。而该IP核的另一种模式,AXI Bridge模式则支持HOST主动读写,以及FPGA主动读写。该模式下有个参数需要配置,分别是PCIe:BARs以及AXI:BARs。而上述的普通模式只有PCIe:BARs需要配置。下面详细说说这两个参数的含义。

weixin_45888152的博客 3732

【研究生学术英语读写教程翻译 中国科学院大学Unit9】

Unit 9 If Humble People Make the Best Leaders,Why Do We Fall for Charismatic Narcissists? 如果谦逊的人是最好的领导者,为什么我们会爱上魅力型自恋者?

fuhanghang的博客 4102

凸包——求周长、面积

凸包 什么是凸包 在平面图中给定一些点集,去求出一些点:相邻2点的连线能够将所有的点包围起来 葛立恒(Graham)扫描法 1、先找到左下角的点P0(一定在凸包上) 2、以P0为原点,将其他的点按照极坐标排序,角度小的排在前,若角度相同,距离近的排在前 3、P0 ,P1 入栈,从P2(第三个点)开始,若P2 在直线P0 P1(p[ i-1 ] p [ i ]) 的左边 ,则P2入栈,否则P1 出...

HappyCode 2842

华为HCIP大数据备考实战:从题库精析到834分通关策略

本文详细介绍了华为HCIP大数据认证考试的备考策略,包括题库精析、重点章节突破和考场实战经验。作者以834分的高分通过考试,分享了官方教材的三遍阅读法、自建题库技巧以及各章节核心知识点,帮助考生高效备考并顺利通关。

weixin_29169899的博客 150

求凸包周长

#include #include #include #include #include #include #include #include #include #include #include const double pi = acos(-1.0); using namespace std; const int MAXN=10005; const double eps=

protecteyesight的博客 980

【TCGA-CRC】TCGA数据读取

本文介绍了如何从TCGA数据库中处理结肠癌(COAD)和直肠癌(READ)的RNA测序数据。首先,通过data.table::fread函数读取基因表达量文件,并检查基因ID和基因名称的一致性。接着,批量读取所有样本的TPM(Transcripts Per Million)数据,并将其合并为表达矩阵。随后,通过匹配样本ID和文件名,确保表达矩阵的列名与样本ID一致。最后,筛选出编码蛋白质的基因,并将处理后的数据保存为Rdata文件。整个过程涉及数据读取、合并、匹配和筛选,为后续的基因表达分析提供了基础。

小八四爱吃甜食的博客 662

ESP32-P4实战:LVGL V9.4 PPA加速配置与性能对比

本文详细介绍了如何在ESP32-P4平台上配置LVGL V9.4的PPA硬件加速功能,通过启用PPA加速显著提升图形处理性能并降低CPU占用率。文章包含环境准备、配置步骤、性能对比及常见问题解决方案,帮助开发者高效利用ESP32-P4的PPA加速器优化嵌入式GUI应用。

rice5的博客 1191

POJ 1113 Wall(凸包应用)

POJ 1113 Wall(凸包应用) http://poj.org/problem?id=1113 题意: ZOJ1456        给你一个多边形X的所有点,要你用一个另一个图形A把这个多边形围起来,使得该多边形的周长最小且该图形A上的每一个点离原始边行的距离>=L. 要你求图形A的最小周长? 分析:        首先该图形A的最小周长肯定是X的凸包长度+半径为L的圆周长之和.

code 1023

手把手教你学Simulink--基础微电网场景实例:基于Simulink的混合交直流微电网架构仿真

本文基于Simulink构建混合交直流微电网仿真模型,通过交流子网(风电+交流负荷)和直流子网(光伏+储能+直流负荷)的协同控制,实现系统效率提升8.5%。重点介绍了混合架构原理、下垂控制策略及Simulink建模方法,包括核心模块实现、协调控制器代码和仿真参数设置。通过三种工况测试验证了系统性能:功率转移响应时间<0.5s,电压波动<5%,显著优于传统独立子网架构。文章还提供了进阶优化方向和完整代码清单,为微电网仿真研究提供实用参考。

MHD0815的博客 129

POJ 1113 Wall (凸包求周长)

题意:在距城堡距离大于L的地方建围墙将城堡围起来求所要围墙的长度 思路:这道题的答案是凸包周长加上一个圆周长,即包围凸包的一个圆角多边形,但是没弄明白那些圆角加起来为什么恰好是一个圆。每个圆角是以凸包对应的顶点为圆心,给定的L为半径,与相邻两条边的切点之间的一段圆弧。每个圆弧的两条半径夹角与对应的凸包的内角互补。假设凸包有n条边,则所有圆弧角之和为180°*n-180°*(n-2)=360°。故

qq_36782366的博客 401

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

POJ 1113 Wall(求凸包周长)

题目链接: POJ 1113 Walla//228K 0MS #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <cmath> using namespace std; const double PI=acos(-1.0); const

ramay7 500

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Wall POJ 1113 (凸包周长)

题目地址:http://poj.org/problem?id=1113 给你n个城堡的坐标(理想为点),建一个围墙离最近城堡的距离为L,求围墙的最小长度。 思路:先构建一个凸包,先假设凸包的边为围墙,再把围墙后移L,围墙之间的空隙用用圆连接。 围墙=凸包周长+2π*L; 凸包的周长for循环求即可。 #include<stdio.h> #include<math.h> #i...

呼吸 274

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

poj1113Wall(凸包周长计算)

poj1113Wall(凸包周长计算):http://poj.org/problem?id=1113 题目描述: Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35235   Accepted: 11996 Description Onc

而濡木染 792

POJ - 1113 Wall 凸包求周长

题目链接:https://cn.vjudge.net/problem/POJ-1113 题解:求下凸包上的点,然后计算围起来的周长,加上2*PI*L即可 #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> ...

还我笑颜 188

POJ 1113 Wall【凸包周长】

题目: http://poj.org/problem?id=1113 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#problem/F Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submiss

free斩 1878

POJ 1113 Wall (凸包周长)

http://poj.org/problem?id=1113 题意:给定nnn个城堡的坐标,要求建设连续的围墙,且围墙上任意一点距离任意城堡距离不小于lll,求围墙的最小长度。 求出这些点的凸包,答案即凸包长度加上一个半径为lll的圆的周长,即对于凸包的边,在距离凸包边lll处建设平行的围墙即可,而对于拐角处,画半径为lll的圆即可,最后各个拐角处可以拼成一个半径为lll的完整圆。 #includ...

sdxtcqs的博客 199

POJ 1113 Wall 凸包求周长

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26286   Accepted: 8760 Description Once upon a time there was a greedy King who ordered his chief Arch

z007kt的专栏 1741

POJ 1113 && HDU 1348 Wall(凸包周长)

给出 n 个点,以及数 L,要求修一面城墙花费最少的资源,使得每个点到达城墙的距离全都大于 L 求出这 n 各点所形成的凸包的周长+以 L 为半径的圆的周长即可 const int N=1e4+5; int i,j,k; int n,m,t; struct Point { double x,y; Point(double x=0,double y=0):x(x),y(y){} }p[N],ch[N]; ...

C_Dreamy的博客 414

【解题报告】 POJ 1113 Wall -- 求凸包周长

题目连接:POJ 1113 题目大意:在在凸包外面加上一个圈,这个圈里凸包的距离最短不超过给定值,求这一圈的最小长度 不会凸包的移步这里 // POJ 1113 Wall -- 凸包周长 + 一个圆 // 相当于在凸包外面加上一个圈,求这一圈的最小长度 , 这个最小长度为 凸包周长 + 一个圆(圆弧在凸包顶点处出现) // 因为多边形外角和360 // #include #in

生命有一种绝对 1522

Wall POJ - 1113 [凸包周长]

Wall POJ - 1113  题意 : 求凸包周长 思路:处理出凸包,两点距离公式 #include&lt;cstdio&gt; #include&lt;vector&gt; #include&lt;cmath&gt; #include&lt;string&gt; #include&lt;string.h&gt; #include&lt;iostream&gt; #include&lt...

Haipai1998的博客 245

Wall POJ - 1113 (凸包周长)

题目链接:https://vjudge.net/problem/POJ-1113 题目: 思路:就是求凸包周长加上一个圆周长

_Vampire的博客 91

POJ1113 Wall(凸包周长)

题目链接:http://poj.org/problem?id=1113 Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28199   Accepted: 9415 Description Once upon a time there

Xuh7的专栏 829
上一篇: UVa 10652 Board Wrapping(凸包面积)
下一篇: POJ 1696 Space Ant(类卷包裹法)
小爷永远不死
博客等级 码龄15年 58粉丝 363原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值