poj 1113 Wall

来源:互联网 发布:自动化行业用单片机吗 编辑:程序博客网 时间:2024/06/05 15:48

凸包入门。点这里

画图就能看出来周长就是一个圆+凸包周长

大佬的模板

一次循环求上部

一次循环求下部

#include<iostream>#include<stdio.h>#include<math.h>#include<stdlib.h>#include<string.h>#include<algorithm>using namespace std;struct node {    double x;double y;}p[400005],s[400005];int n,m;int sq(int x){    return x*x;}double chaji(node a,node b){    return a.x*b.y-a.y*b.x;}double dist(node a,node b){    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}node xl(node a,node b){    node c;    c.x=a.x-b.x;    c.y=a.y-b.y;    return c;}bool cmp(node a,node b){    if(a.x==b.x) return a.y<b.y;    else return a.x>b.x;}int main(){  int n,l;    while(scanf("%d %d",&n,&l)!=EOF)    {      memset(s,0,sizeof(s));        for (int i=0;i<n;i++)        {             scanf("%lf%lf",&p[i].x,&p[i].y);            }         sort(p,p+n,cmp);        int tot=0;        for (int i=0;i<n;i++)        {            while(tot>1 && chaji(xl(s[tot-1],s[tot-2]),xl(p[i],s[tot-2]))<=0) tot--;            s[tot++]=p[i];        }        int k=tot;         for (int i=n-2;i>=0;i--)        {            while(tot>k && chaji(xl(s[tot-1],s[tot-2]),xl(p[i],s[tot-2]))<=0) tot--;            s[tot++]=p[i];        }        if(n>1) tot--;        double ans=0.0;        for (int i=0;i<tot;i++)        {        ans+=dist(s[i],s[i+1]);        }        ans+=2*l*3.1415926;        printf("%.0lf\n",ans);    }    return 0;}


原创粉丝点击