1、HDU 1392 Surround the Trees  

2、题意:就是求凸包周长

3、总结:第一次做计算几何,没办法,还是看了大牛的博客

#include<iostream>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#define F(i,a,b) for (int i=a;i<b;i++)
#define FF(i,a,b) for (int i=a;i<=b;i++)
#define mes(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
const int N=,MAX=;
const double eps=1e-; struct Point
{
double x,y;
}p[N],stack[N]; int isZero(double x) { //x是否为0,还是不明白为什么要引入eps
return (x>?x:-x)<eps;
} double crossProd(Point A,Point B,Point C) { //叉积,这样写即A->B到A->C逆时针为正
return (B.x-A.x)*(C.y-A.y)-(B.y-A.y)*(C.x-A.x);
} double dis(Point A,Point B) {
return sqrt((B.x-A.x)*(B.x-A.x)+(B.y-A.y)*(B.y-A.y));
} //以最左下的点为基准点,其他各点(逆时针方向)以极角从小到大的排序规则
int cmp(const void *a,const void *b) { //这里表示*a在*b后
Point *c=(Point *)a, *d=(Point *)b;
double k=crossProd(p[],*c,*d); //极角大小转化为求叉乘
if(k<eps||isZero(k)&&dis(p[],*d)<dis(p[],*c)) return ;
return -;
} int n;
double Graham()
{
int mi=;
double mx=p[].x, my=p[].y;
FF(i,,n) { //找到最左下点
if(my>p[i].y||my==p[i].y&&mx>p[i].x) {
mi=i, my=p[i].y, mx=p[i].x;
}
}
p[]=p[mi], p[mi]=p[], p[]=p[]; //最左下点要换到p开头,不能让它和它自己比
qsort(p+,n-,sizeof(Point),cmp);
stack[]=p[], stack[]=p[], stack[]=p[];
p[n+]=p[]; //在结尾加最左下点为结束点,一开始没加,直接在len加了一个dis(p[1],p[n]),这样忽略了很多
int top=;
for(int i=; i<=n+; i++) {
//加入一个点后,向右偏拐或共线,则上一个点不在凸包内,则--top,该过程直到不向右偏拐或没有三点共线的点
while(crossProd(stack[top-],stack[top],p[i])<eps&&top>=) top--;
stack[++top]=p[i];
}
double len=;
F(i,,top) {
len+=dis(stack[i],stack[i+]);
}
return len;
} int main()
{
while(scanf("%d",&n)!=EOF,n) {
FF(i,,n) {
scanf("%lf%lf",&p[i].x,&p[i].y);
}
if(n==) printf("0.00\n");
else if(n==) printf("%.2lf\n",dis(p[],p[]));
else {
printf("%.2lf\n",Graham()); //这里printf用G++11竟然输出0
}
} return ;
}

HDU 1392 凸包模板题,求凸包周长的更多相关文章

  1. hdu 1348 Wall(凸包模板题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 Wall Time Limit: 2000/1000 MS (Java/Others)    M ...

  2. HDU 1392 Surround the Trees(凸包入门)

    Surround the Trees Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  3. hdu4266(三维凸包模板题)

    /*给出三维空间中的n个顶点,求解由这n个顶点构成的凸包表面的多边形个数. 增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况: 1> 在凸包内,则可以跳过 2> ...

  4. POJ 3348 Cows | 凸包模板题

    题目: 给几个点,用绳子圈出最大的面积养牛,输出最大面积/50 题解: Graham凸包算法的模板题 下面给出做法 1.选出x坐标最小(相同情况y最小)的点作为极点(显然他一定在凸包上) 2.其他点进 ...

  5. POJ 1113 凸包模板题

    上模板. #include <cstdio> #include <cstring> #include <iostream> #include <algorit ...

  6. HDU 1392 Surround the Trees 构造凸包

    又是一道模板题 #include <iostream> #include <cstring> #include <cstdlib> #include <cst ...

  7. HDU 2138 Miller-Rabin 模板题

    求素数个数. /** @Date : 2017-09-18 23:05:15 * @FileName: HDU 2138 miller-rabin 模板.cpp * @Platform: Window ...

  8. HDU 2087 kmp模板题

    s为主串 t为模板串 求t的nextt 加const #include<stdio.h> #include<string.h> #include<algorithm> ...

  9. HDU 1392 Surround the Trees(凸包)

    题面 懒得粘贴了... 大致题意:坐标系内有若干个点,问把这些点都圈起来的最小凸包周长. 题解 直接求出凸包,统计一遍答案即可 #include<iostream> #include< ...

随机推荐

  1. Spring实战 (第3版)——AOP

    在软件开发中,分布于应用中多处的功能被称为横切关注点.通常,这些横切关注点从概念上是与应用的 业务逻辑相分离的(但是往往直接嵌入到应用的业务逻辑之中).将这些横切关注点与业务逻辑相分离正是 面向切面编 ...

  2. 代理模式及jdk动态代理原理

    代理模式 :为其它对象提供代理,以控制对这个对象的访问. 代理模式的特征:代理类(proxyClass)与委托类(realClass)有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转 ...

  3. 微信小程序实质是什么? Hybrid App

    微信小程序是一种不需要下载安装即可使用的应用,用户扫一扫或者搜一下即可打开应用.微信小程序实质是Hybrid技术的应用.Hybrid App(混合模式移动应用). 小程序能够更多的可以更多的调用手机本 ...

  4. Linux 新建用户、用户组,给用户分配权限(chown、useradd、groupadd、userdel、usermod、passwd、groupdel)

    Linux 系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统.用户的账号一方面可以帮助系统管理员对使用系统的用户进行 ...

  5. jquery版小型婚礼(可动态添加祝福语)

    前两天在网上不小心看到“js许愿墙”这几个字,我的神经就全部被调动了.然后就开始我的百度生涯,一直寻觅许愿墙背景图片和便利贴图片,觅了好久……一直没找到满意的……无意间看到祝福语和一些卡通婚礼图片.最 ...

  6. Hadoop 部署过程中的一些问题与解决方案

    环境--> centos7.1 --> jdk1.8 1.JDK卸载与安装 http://blog.csdn.net/czmchen/article/details/41047187 2. ...

  7. gulp使用技巧-删除node_modules文件夹,解决目录层次太深删除报错的问题

    问题描述: 在使用gulp当中,自动生成的node_modules文件夹,因为文件目录层级太深,无法系统删除,用360粉碎工具也报错 解决方法: 使用npm中的插件rimraf,专门用于删除的模块插件 ...

  8. Linux ftp访问控制配置,包括访问ftp权限和访问ftp目录权限

    在Linux 上建立用户为website1 home目录是/data/home/website1 但是用ftp登录以后,路径可以随便切换,并且可以进入别的站点下 进行增.删.改 本篇的目的是:在lin ...

  9. 启动apache和tomcat端口被占用解决办法

    1,打开控制台,使用命令 netstat -aon|findstr 8090  找出端口被占用的进程, 2,使用 taskkill -f -pid 4116(进程id)杀掉当前占用端口的进程

  10. DES & 3DES 加密算法

    JAVA坑 跟其他公司java的对接口,一个细节对到吐血,具体: DesUtil.java(别人的反例) //package base_class; import java.io.IOExceptio ...