USACO 5.1.1凸包
转自:http://blog.csdn.net/cnyali/article/details/50097593
程序:
#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; }