Description
Input
Output
Sample Input
9 100 200 400 300 400 300 300 400 300 400 400 500 400 500 200 350 200 200 200
Sample Output
1628
据说明天有省赛 后天有网络赛 突然想到有这么一块不会的 学习一下 ~
水一题 就是求凸包的长度+圆形的周长 这么唱的代码比赛的时候怎么办
#include <iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const double eps=1e-8; const double pi=acos(-1.0); const double inf=1e20; const int maxp=1111; int dblcmp(double d) { if (fabs(d)<eps)return 0; return d>eps?1:-1; } inline double sqr(double x){return x*x;} struct point { double x,y; point(){} point(double _x,double _y): x(_x),y(_y){}; void input() { scanf("%lf%lf",&x,&y); } void output() { printf("%.2f %.2f\n",x,y); } bool operator==(point a)const { return dblcmp(a.x-x)==0&&dblcmp(a.y-y)==0; } bool operator<(point a)const { return dblcmp(a.x-x)==0?dblcmp(y-a.y)<0:x<a.x; } double len() { return hypot(x,y); } double len2() { return x*x+y*y; } double distance(point p) { return hypot(x-p.x,y-p.y); } point add(point p) { return point(x+p.x,y+p.y); } point sub(point p) { return point(x-p.x,y-p.y); } point mul(double b) { return point(x*b,y*b); } point div(double b) { return point(x/b,y/b); } double dot(point p) { return x*p.x+y*p.y; } double det(point p) { return x*p.y-y*p.x; } }; struct polygon { int n; point p[maxp]; void input(int _n) { n=_n; for (int i=0;i<n;i++) { p[i].input(); } } void add(point q) { p[n++]=q; } struct cmp { point p; cmp(const point &p0){p=p0;} bool operator()(const point &aa,const point &bb) { point a=aa,b=bb; int d=dblcmp(a.sub(p).det(b.sub(p))); if (d==0) { return dblcmp(a.distance(p)-b.distance(p))<0; } return d>0; } }; void getconvex(polygon &convex) { int i,j,k; sort(p,p+n); convex.n=n; for (i=0;i<min(n,2);i++) { convex.p[i]=p[i]; } if (n<=2)return; int &top=convex.n; top=1; for (i=2;i<n;i++) { while (top&&convex.p[top].sub(p[i]).det(convex.p[top-1].sub(p[i]))<=0) top--; convex.p[++top]=p[i]; } int temp=top; convex.p[++top]=p[n-2]; for (i=n-3;i>=0;i--) { while (top!=temp&&convex.p[top].sub(p[i]).det(convex.p[top-1].sub(p[i]))<=0) top--; convex.p[++top]=p[i]; } } double getcircumference() { double sum=0; int i; for (i=0;i<n;i++) { sum+=p[i].distance(p[(i+1)%n]); } return sum; } }; int n; int L; int main() { while (~scanf("%d%d",&n,&L)) { polygon a,b; a.input(n); a.getconvex(b); double ans=b.getcircumference()+2.0*pi*L; printf("%0.0f\n",ans); } return 0; }