hdoj 1348 Wall (凸包周长)

2023-11-09 22:38
文章标签 周长 凸包 hdoj wall 1348

本文主要是介绍hdoj 1348 Wall (凸包周长),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

http://acm.hdu.edu.cn/showproblem.php?pid=1348
题意:一个国王有 n n 个城堡,他要在这些城堡外建城墙,使得城墙距离任一城堡的距离都大于l,给出这些城堡的坐标,求城墙的最小周长。

找到这些城堡的凸包,然后对于凸包的边平行着建就行,在拐角处画一个半径为 l l 的圆弧,最终所有圆弧合起来正好是一个半径为l的圆,所以最终答案是凸包的周长+半径为 l l <script type="math/tex" id="MathJax-Element-400">l</script> 的圆的周长
求凸包用的是Graham算法,最后结果要四舍五入。
还有一个小小的格式问题就是每组数据之间有一个空行,最后一组数据后面没有空行。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
struct node
{int x,y;
} a[105],p[105];
int top,n;
double l,ans,pi=acos(-1.0);
double cross(node p0,node p1,node p2)//计算叉乘,p0p1 X p0p2 注意p0,p1,p2的位置,这个决定了方向
{return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
double dis(node a,node b)//计算距离,这个用在了当两个点在一条直线上
{return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
bool cmp(node p1,node p2)//极角排序
{double z=cross(a[0],p1,p2);if(z>0||(z==0&&dis(a[0],p1)<dis(a[0],p2)))return 1;return 0;
}
int round_double(double number)
{return (number>0.0)?(number+0.5):(number-0.5);
}
void Graham()
{int k=0;for(int i=0; i<n; i++)if(a[i].y<a[k].y||(a[i].y==a[k].y&&a[i].x<a[k].x))k=i;swap(a[0],a[k]);//找p[0],取最下,同最下取最左sort(a+1,a+n,cmp);top=1;p[0]=a[0];p[1]=a[1];for(int i=2; i<n; i++)//控制进栈出栈{while(cross(p[top-1],p[top],a[i])<0&&top)top--;top++;p[top]=a[i];}
}
int main()
{int T;scanf("%d",&T);while(T--){ans=0;scanf("%d%lf",&n,&l);for(int i=0; i<n; i++){scanf("%d%d",&a[i].x,&a[i].y);}Graham();top++;p[top]=p[0];for(int i=0;i<top;i++){ans+=dis(p[i],p[i+1]);}printf("%d\n",round_double(ans+l*2*pi));if(T) printf("\n");}return 0;
}

这篇关于hdoj 1348 Wall (凸包周长)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/378857

相关文章

poj 1113 凸包+简单几何计算

题意: 给N个平面上的点,现在要在离点外L米处建城墙,使得城墙把所有点都包含进去且城墙的长度最短。 解析: 韬哥出的某次训练赛上A出的第一道计算几何,算是大水题吧。 用convexhull算法把凸包求出来,然后加加减减就A了。 计算见下图: 好久没玩画图了啊好开心。 代码: #include <iostream>#include <cstdio>#inclu

poj 2187 凸包or旋转qia壳法

题意: 给n(50000)个点,求这些点与点之间距离最大的距离。 解析: 先求凸包然后暴力。 或者旋转卡壳大法。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <s

Codeforces Beta Round #47 C凸包 (最终写法)

题意慢慢看。 typedef long long LL ;int cmp(double x){if(fabs(x) < 1e-8) return 0 ;return x > 0 ? 1 : -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}point op

HDU 1392 HDU 1348 凸包

求凸包的周长,  注意n=1 , 2时特殊情况 int cmp(double x){if(fabs(x) < 1e-8) return 0 ;if(x > 0) return 1 ;return -1 ;}struct point{double x , y ;point(){}point(double _x , double _y):x(_x) , y(_y){}frien

【UVA】10652-Board Wrapping(凸包问题)

又增加了2个模板。 #include <iostream>#include <cstdlib>#include <cstdio>#include <string>#include <cstring>#include <cmath>#include <vector>#include <queue>#include <stack>#include <algorithm>usi

百度之星初赛1006(计算几何:能包含凸包的最小矩形面积)

矩形面积    Accepts: 717    Submissions: 1619  Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description 小度熊有一个桌面,小度熊剪了很多矩形放在桌面上,小度熊想知道能把这些

OpenCV结构分析与形状描述符(8)点集凸包计算函数convexHull()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 查找一个点集的凸包。 函数 cv::convexHull 使用斯克拉斯基算法(Sklansky’s algorithm)来查找一个二维点集的凸包,在当前实现中该算法的时间复杂度为 O(N logN)。 函数 cv::convexHull 是

OpenCV结构分析与形状描述符(9)检测轮廓相对于其凸包的凹陷缺陷函数convexityDefects()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 查找一个轮廓的凸性缺陷。 下图显示了一个手部轮廓的凸性缺陷: convexityDefects 是 OpenCV 库中的一个函数,用于检测轮廓相对于其凸包的凹陷缺陷。这个函数可以帮助识别轮廓中的凹进去的部分,通常被用来分析手部或其他物体的形状

P4560 [IOI2014] Wall 砖墙

*原题链接* 做法:线段树 一道比较基础的线段树练手题,区间赋值,在修改时加些判断剪枝。 对于add操作,如果此时区间里的最小值都大于等于h的话,就没必要操作,如果最大值都小于h的话,就直接区间赋值为h。对于remove操作同理。 时间复杂度大致为,实际会比这个要大一些。 #include<bits/stdc++.h>using namespace std;const int N=2

分治算法与凸包问题

1. 什么是凸包问题? 凸包问题是计算几何中的经典问题。给定二维平面上的点集,凸包是一个最小的凸多边形,它包含了点集中所有的点。你可以把凸包想象成一根松紧带将所有点紧紧包裹住的样子,凸包的边缘仅沿着最外面的点延伸。 2. 分治法简介 分治算法是解决复杂问题的强大策略,它的思想是将问题分解为多个子问题,分别解决这些子问题后再合并得到最终解。凸包问题可以通过分治算法高效地解决,时间复杂度可以达到