USACO 5.1.1 凸包参考程序

来源:互联网 发布:talkingdata数据造假 编辑:程序博客网 时间:2024/05/22 02:22
#include <iostream>#include <algorithm>#include <cstdio>#include <cmath>using namespace std;typedef struct{double x,y;}P;typedef struct{int s,t;double k,l;}E;int n,top;double sum;P p[10010];E e[20020];bool comp(const P &a,const P &b){return a.x<b.x;}double dist(int a,int b){return sqrt((p[a].x-p[b].x)*(p[a].x-p[b].x)+(p[a].y-p[b].y)*(p[a].y-p[b].y));}double slope(int a,int b){if (p[b].x-p[a].x==0) return 0;return (p[b].y-p[a].y)*1.0/(p[b].x-p[a].x);}int main(){freopen("fc.in","r",stdin);freopen("fc.out","w",stdout);int i,j;scanf("%d",&n);for (i=1;i<=n;i++)scanf("%lf%lf",&p[i].x,&p[i].y);sort (p+1,p+n+1,comp);i=1;while (i<n) {j=i+1;e[++top].s=i;e[top].t=j;e[top].l=dist(i,j);e[top].k=slope(i,j);while (top>1&&e[top-1].k>e[top].k) {top--;e[top].t=e[top+1].t;e[top].l=dist(e[top].s,e[top].t);e[top].k=slope(e[top].s,e[top].t);}i++;}while (top>0) sum+=e[top--].l;i=1;while (i<n) {j=i+1;e[++top].s=i;e[top].t=j;e[top].l=dist(i,j);e[top].k=slope(i,j);while (top>1&&e[top-1].k<e[top].k) {top--;e[top].t=e[top+1].t;e[top].l=dist(e[top].s,e[top].t);e[top].k=slope(e[top].s,e[top].t);}i++;}while (top>0) sum+=e[top--].l;printf("%.2f\n",sum);return 0;}

0 0