poj 1113(凸包入门)
2014-04-15 23:30
302 查看
没什么说的,福利题,自然要秒了
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const double pi=acos(-1.0); struct P { double x,y; P () {} P (double x,double y):x(x),y(y){ } P operator -(P p){ return P(x-p.x,y-p.y); } double det(P p){ return x*p.y-y*p.x; } }; double dis(P a,P b) { double c=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y); return sqrt(c); } bool cmp(P a,P b) { if(a.x!=b.x) return a.x<b.x; return a.y<b.y; } P q[100000],qs[100000]; int k,n,r; int main() { while(~scanf("%d%d",&n,&r)) { k=0; for(int i=0;i<n;i++) scanf("%lf%lf",&q[i].x,&q[i].y); sort(q,q+n,cmp); for(int i=0;i<n;i++) { while(k>1 && (qs[k-1]-qs[k-2]).det(q[i]-qs[k-2])<=0) k--; qs[k++]=q[i]; } for(int i=n-1,t=k;i>=0;i--) { while(k>t && (qs[k-1]-qs[k-2]).det(q[i]-qs[k-2])<=0) k--; qs[k++]=q[i]; } double sum=0.0; for(int i=0;i<k-1;i++) { sum+=dis(qs[i],qs[i+1]); // printf("%lf\n",sum); } printf("%.0lf\n",sum+2*pi*(double)r); } return 0; }
相关文章推荐
- POJ 1113 Wall 【凸包入门】
- poj1113 凸包入门题
- POJ 1113(凸包入门题)
- POJ1113---Wall(基础计算几何:凸包入门)
- POJ 1113 入门凸包
- POJ 1113 凸包2 Graham-scan 入门题(极角序,水平序)
- POJ训练计划1113_Wall(几何/凸包)
- POJ 1113 Wall (凸包)
- poj 1113 wall 简单的凸包
- poj 1113 Wall(凸包)
- 计算几何--求凸包模板--Graham算法--poj 1113
- poj 1113 凸包周长
- Wall - POJ 1113(求凸包)
- POJ--1113 -- Wall [使用卷包裹法求凸包] [Gift Wrapping]
- poj 1113 Wall 凸包
- POJ 1113 Wall【凸包周长】
- 【计算几何】【求凸包】【POJ 1113】wall
- poj 1113 求凸包
- POJ 1113 Wall 凸包求周长
- 【解题报告】 POJ 1113 Wall -- 求凸包周长