zoukankan      html  css  js  c++  java
  • USACO Training Section 5.1 Fencing the Cows 圈奶牛(凸包)

    夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏。他建造的围栏必须包括他的奶牛喜欢吃草的所有地点。对于给出的这些地点的坐标,计算最短的能够围住这些点的围栏的长度。
    输入
    输入数据的第一行包括一个整数 N。N(0 <= N <= 10,000)表示农夫约翰想要围住的放牧点的数目。接下来 N 行,每行由两个实数组成,Xi 和 Yi,对应平面上的放牧点坐标(-1,000,000 <= Xi,Yi <= 1,000,000)。数字用小数表示。
    输出
    输出必须包括一个实数,表示必须的围栏的长度。答案保留两位小数。
    样例输入
    4
    4 8
    4 12
    5 9.3
    7 8
    样例输出
    12.00

    不说了

    凸包模板题

    维护了凸包后计算相邻两个点之间的距离

    #include<bits/stdc++.h>
    using namespace std;
    #define eps 1e-5
    inline int read(){
        char ch=getchar();
        int res=0;
        while(!isdigit(ch)) ch=getchar();
        while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar();
        return res;
    }
    int n,m;
    struct  point{
        double x,y;
        point(){}
        point (int a,int b):
            x(a),y(b){};
        friend inline point operator -(const point &a,const point &b){
            return point(a.x-b.x,a.y-b.y);
        }
        friend inline double operator *(const point &a,const point &b){
            return (a.x*b.y-a.y*b.x);
        }
        inline double calc()const{
            return x*x+y*y;
        }
    }p[10005],q[10005];
    inline bool comp(const point &a,const point &b){
        double det=(a-p[1])*(b-p[1]);
        if(fabs(det)>=eps) return det>0;
        return a.calc()<b.calc();
    }
    inline double coun(point a,point b){
        return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    inline void graham(){
        int date=1;
        for(int i=2;i<=n;i++){
            if(p[i].x<p[date].x||(p[i].x==p[date].x&&p[i].y<p[date].y))
            date=i;
        }
        if(date!=1) swap(p[date],p[1]);
        sort(p+2,p+1+n,comp);
        q[++m]=p[1];
        for(int i=2;i<=n;i++){
            while(m>=3&&((q[m]-q[m-1])*(p[i]-q[m-1])<=eps))m--;
            q[++m]=p[i];
        }
        q[m+1]=p[1];
    }
    inline double cal(){
        double ans=0;
        for(int i=1;i<=m;i++){
            ans+=coun(q[i+1],q[i]);
        }
        return ans;
    }
    int main(){
        n=read();
        for(int i=1;i<=n;i++){
            cin>>p[i].x>>p[i].y;
        }
        graham();
        double s=cal();
        printf("%.2lf
    ",s);
    }
    
  • 相关阅读:
    Go学习笔记(四)Go自动化测试框架
    VSCode快捷键
    Go学习笔记(三)Go语言学习
    Go学习笔记(二)搭建Visual Studio Code调试环境
    Go学习笔记(一)安装Go语言环境
    C# HTTPServer和OrleansClient结合
    C# Post HTTP Request
    Unity3D UGUI Shader画一个圆环
    Orleans学习总结(六)--应用篇
    Orleans学习总结(四)--集群配置篇
  • 原文地址:https://www.cnblogs.com/stargazer-cyk/p/10366469.html
Copyright © 2011-2022 走看看