zoukankan      html  css  js  c++  java
  • 凸包白书模板

    以hdu1392为例。

    hdu1392要求找到给定点的凸包,并求出凸包周长。由凸包的定义可以知道这个周长是包围这些点的最小周长。

    当点数少于3时根据题目进行讨论。

    /* ***********************************************
    Author        :guanjun
    Created Time  :2016/5/24 9:22:36
    File Name     :hdu1392.cpp
    ************************************************ */
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <stdio.h>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <iomanip>
    #include <list>
    #include <deque>
    #include <stack>
    #define ull unsigned long long
    #define ll long long
    #define mod 90001
    #define INF 0x3f3f3f3f
    #define maxn 10010
    #define cle(a) memset(a,0,sizeof(a))
    const ull inf = 1LL << 61;
    const double eps=1e-5;
    using namespace std;
    int n,top;
    
    struct point{
        int x,y;
    }p[maxn],sta[maxn];
    
    bool cmp(point a,point b){
        if(a.x==b.x)return a.y<b.y;
        return a.x<b.x;
    }
    int cross(point a,point b,point c){
        return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
    }
    int graham(){
        sort(p,p+n,cmp);
        int top=0;
        for(int i=0;i<n;i++){
            while(top>1&&cross(sta[top-2],sta[top-1],p[i])<=0)top--;
            sta[top++]=p[i];
        }
        int t=top;
        for(int i=n-2;i>=0;i--){
            while(top>t&&cross(sta[top-2],sta[top-1],p[i])<=0)top--;
            sta[top++]=p[i];
        }
        if(n>1)top--;
        return top;
    }
    double dis(point a,point b){
        return sqrt(1.0*((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)));
    }
    int main()
    {
        #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
        #endif
        //freopen("out.txt","w",stdout);
        while(cin>>n&&n){
            for(int i=0;i<n;i++){
                scanf("%d%d",&p[i].x,&p[i].y);
            }
            top=graham();
            double sum=0;
            for(int i=1;i<=top;i++){
                sum+=dis(sta[i],sta[i-1]);
            }
            if(n==1)puts("0.00");
            else if(n==2)printf("%.2f
    ",dis(p[0],p[1]));
            else printf("%.2f
    ",sum);
        }
        return 0;
    }
  • 相关阅读:
    linux安装vsftpd服务器
    安装Twisted
    py文件转换为exe文件
    Python实现批量新建SecureCRT Session
    常见的字符编码
    心得 : 面向对象和面向过程的区别
    Apache配置HTTPS的过程小记
    关于oracle的sequence和trigger。
    oracle在drop表时要注意
    mysql中整数类型后面的数字,是不是指定这个字段的长度?比如int(11),11代表11个字节吗?
  • 原文地址:https://www.cnblogs.com/pk28/p/5523430.html
Copyright © 2011-2022 走看看