zoukankan      html  css  js  c++  java
  • hdu 1392 凸包周长

    直接上模板,不过模板还不够精练,以后再慢慢优化

    /*
    * hdu1392/win.cpp
    * Created on: 2011-10-22
    * Author : ben
    */
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <ctime>
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <set>
    #include <map>
    #include <stack>
    #include <string>
    #include <vector>
    #include <deque>
    #include <list>
    #include <functional>
    #include <numeric>
    #include <cctype>
    using namespace std;
    const int MAXN = 110;
    const double eps = 1e-8;
    #define zero(x) (((x)>0?(x):-(x))<eps)
    typedef double typec;
    typedef struct {
    typec x;
    typec y;
    } MyPoint;
    inline double xmult(MyPoint p1, MyPoint p2, MyPoint p0) {
    return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
    }
    MyPoint p1, p2;
    inline bool graham_less(const MyPoint& a, const MyPoint& b) {
    double ret = xmult(a, b, p1);
    if (zero(ret)) {
    return xmult(a, b, p2) < 0;
    } else {
    return ret < 0;
    }
    }
    void _graham(int n, MyPoint* p, int& s, MyPoint* ch) {
    int i, k = 0;
    for (p1 = p2 = p[0], i = 1; i < n; p2.x += p[i].x, p2.y += p[i].y, i++) {
    if (p1.y - p[i].y > eps || (zero(p1.y - p[i].y) && p1.x > p[i].x)) {
    p1 = p[k = i];
    }
    }
    p2.x /= n, p2.y /= n;
    p[k] = p[0], p[0] = p1;
    sort(p + 1, p + n, graham_less);
    for (ch[0] = p[0], ch[1] = p[1], ch[2] = p[2], s = i = 3; i < n; ch[s++] =
    p[i++]) {
    for (; s > 2 && xmult(ch[s - 2], p[i], ch[s - 1]) < -eps; s--) {
    ;
    }
    }
    }
    //构造凸包接口函数,传入原始点集大小n,点集p(p原有顺序被打乱!)
    //返回凸包大小,凸包的点在convex中
    //参数maxsize为1包含共线点,为0不包含共线点,缺省为1
    //参数clockwise为1顺时针构造,为0逆时针构造,缺省为1
    //在输入仅有若干共线点时算法不稳定,可能有此类情况请另行处理!
    //不能去掉点集中重合的点
    int graham(int n, MyPoint* p, MyPoint* convex, int maxsize = 1, int dir = 1) {
    MyPoint* temp = new MyPoint[n];
    int s, i;
    _graham(n, p, s, temp);
    convex[0] = temp[0], n = 1, i = (dir ? 1 : (s - 1));
    for (; dir ? (i < s) : i; i += (dir ? 1 : -1) ) {
    if (maxsize || !zero(xmult(temp[i-1],temp[i],temp[(i+1)%s]))) {
    convex[n++]=temp[i];
    }
    }
    delete[] temp;
    return n;
    }
    inline double mydistance(MyPoint &p1, MyPoint &p2) {
    double deltax = p1.x - p2.x;
    double deltay = p1.y - p2.y;
    return sqrt(deltax * deltax + deltay * deltay);
    }
    MyPoint points[MAXN], tubao[MAXN];

    int main() {
    #ifndef ONLINE_JUDGE
    freopen("data.in", "r", stdin);
    #endif
    int n, m;
    double ans;
    while (scanf("%d", &n) == 1 && n > 0) {
    for (int i = 0; i < n; i++) {
    scanf("%lf%lf", &points[i].x, &points[i].y);
    }
    ans = 0;
    if (n == 2) {
    ans = mydistance(points[0], points[1]);
    } else {
    m = graham(n, points, tubao);
    for (int i = 0; i < m; i++) {
    ans += mydistance(tubao[i], tubao[(i + 1) % m]);
    }
    }
    printf("%.2f\n", ans);
    }
    return 0;
    }

  • 相关阅读:
    网安-04-DHCP部署与安全、DNS部署与安全
    网安-03-NTFS安全权限、文件共享服务器
    网安-02-批处理、病毒、用户与组管理、破解系统密码
    网安-01-IP详解及简单的DOS命令
    [异常笔记]required a bean of type 'org.quartz.JobExecutionContext' that could not be found
    [异常笔记]poi读取Excel异常
    CentOS7 minimal 没有netstat命令
    Docker运行Nginx服务器
    大数据开发从入门小白到删库跑路(一)- 获取Hadoop
    Docker 运行MangoDB
  • 原文地址:https://www.cnblogs.com/moonbay/p/2221397.html
Copyright © 2011-2022 走看看