凸包模板

#include<cstdio>
#include<cstring>
#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;const int N=105;
const double eps=1e-8;struct point{double x;double y;
}p[N], stack[N];bool isZero(double x){return (x>0 ? x : -x) <eps;
}double dis(point A,point B){return sqrt((A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y));
}double crossProd(point A,point B,point C){return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);
}int cmp(const void *a, const void *b) {point *c = (point *)a;point *d = (point *)b;double k = crossProd(p[0], *c, *d);//极角大小转化为求叉乘if (k<eps || isZero(k) && dis(p[0], *c)>dis(p[0], *d)) return 1;return -1;
}double Graham(int n)
{int i,x=p[0].x,y=p[0].y;int mi=0;for( i=1;i<n;i++){if(p[i].x<x||(p[i].x==x&&p[i].y<y)){x=p[i].x;y=p[i].y;mi=i;}}point tmp=p[mi];p[mi]=p[0];p[0]=tmp;qsort(p+1, n-1, sizeof(point), cmp);p[n]=p[0];stack[0]=p[0];stack[1]=p[1];stack[2]=p[2];int top=2;for(i=3;i<=n;i++){while(crossProd(stack[top-1],stack[top],p[i])<eps &&top>=2) --top;stack[++top]=p[i];}double len=0;for(int i=0;i<top;i++) len+=dis(stack[i],stack[i+1]);return len;
}int main()
{int n;while(scanf("%d",&n),n){int i;for(i=0;i<n;i++){scanf("%lf %lf",&p[i].x,&p[i].y);}if(n==1) printf("0.00\n");else if(n==2) printf("%.2lf\n",dis(p[0],p[1]));elseprintf("%.2lf\n",Graham(n));}
}

hdu 1392 Surround the Trees相关推荐

  1. 1392 - Surround the Trees

    凸包裸题. #include<cstdio> #include<cstring> #include<iostream> #include<vector> ...

  2. 【解题报告】【HDOJ1392】【Graham凸包】Surround the Trees

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392 典型凸包 1.当只有一个点时 输出时0.00 2.当只有两个点时 输出时两个点的距离 3.当n& ...

  3. hdu-1392 Surround the Trees poj Rope (简单凸包)

    hdu  : http://acm.hdu.edu.cn/showproblem.php?pid=1392 题意:给你n个数的坐标,用一根绳子把它们围起来,问你需要多长的绳子? (当数的个数为2时特判 ...

  4. HDU 3240 Counting Binary Trees 数论-卡特兰数

    题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3240 卡特兰数递推公式h(i)=h(i-1)*(4*i-2)/(i+1) 如果直接算每一步,然后mo ...

  5. hdu 1693 Eat the Trees 插头dp

    每一个点可向上下左右四个方向连边,这就是插头. 每一条轮廓线切开的是当前已确定的点的未确定的点,其经过的插头有m个竖着的,一个横着的,懒得画图了.. 每一次转移就是将左边的变到下面,上面的变到左边,每 ...

  6. HDU 6691 Minimum Spanning Trees

    题目 题意: 对于一个n个点的图,每对点 u , v u,v u,v间有 p 0 p_0 p0​的几率没有边, p 1 p_1 p1​的几率有权值为1的边, p 2 p_2 p2​-边权 < = ...

  7. 计算几何-经典算法-凸包

    在学习了一些有关计算机几何的基础知识和一些基本工具之后要快速的解决一些简单的几何问题,如两点之间的距离.两线段的交点个数等等是可以轻松应付的,但是对于复杂点的几何问题,我们还是要有更好的算法,这样才可 ...

  8. 杭电OJ分类题目(3)

    原题出处:HDOJ Problem Index by Type,http://acm.hdu.edu.cn/typeclass.php 杭电OJ分类题目(3) HDU Computational Ge ...

  9. 凸包——Graham-Scan算法

    凸包(Convex Hull)是一个计算几何(图形学)中的概念. 在一个实数向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包.X的凸包可以用X内所有点(X1,-Xn)的凸组合来构造 ...

最新文章

  1. MySQL查询进阶之多表查询
  2. 频率计c语言程序,数字频率计中C语言编程的研究
  3. 【最小费用最大流】Going Home
  4. JZOJ 3815. 【NOIP2014模拟9.7】克卜勒
  5. PHP跳转方法:Header() + location.href
  6. python 基础 -- python 模块
  7. C#学习常用类(1003)---Timer类(System.Timers.Timer)
  8. vue 内存溢出问题解决
  9. Codeforces Global Round 3(A-D)
  10. android c 内存泄露,内存泄漏弄个明白
  11. Tiny6410 U-boot移植
  12. 大揭秘(1):网店背后的隐秘产业链【连载】
  13. 2022年3月15日黑马第三天
  14. TDM阅读笔记,在推荐系统的应用
  15. IIC驱动0.96寸OLED屏幕显示(51单片机)
  16. #453 原汤话原食:除夕夜请热心市民陪我销毁一下烟花爆竹
  17. python如何用for循环写九九乘法表
  18. 计算机组成原理 第三章存储系统 知识点
  19. oracle spa性能测试,SPA for 11g 分析性能
  20. 基于 uni-app 和 uni-cloud 小程序项目开发实战

热门文章

  1. 高级数据结构与算法 | 并查集(Union-Find)
  2. 这些令人仰望的C++大咖,都是怎样炼成的?
  3. 深入理解软件和硬件(国庆精彩活动预告)
  4. 课堂上传纸条如何防范中间人攻击?
  5. ETCD 问题、调优、监控
  6. “保持耐心”,永远从用户角度出发— 专访阿里巴巴淘系技术内容中台负责人吴桂林(梁舒)...
  7. 【线上分享】RTC业务中的视频编解码引擎构建
  8. Xilinx视频加速技术专场
  9. JVM之常用基础参数详解
  10. Java多线程之CyclicBarrier用法