poj1113 Wall【凸包】
2017-04-18 17:11
309 查看
题目链接:http://poj.org/problem?id=1113
题意:给你一个多边形,让你在距离他x的地方围一圈有弧形的矩形,让你求这个矩形的周长
解析:其实就是凸包边长,加上半径为x的圆的面积
题意:给你一个多边形,让你在距离他x的地方围一圈有弧形的矩形,让你求这个矩形的周长
解析:其实就是凸包边长,加上半径为x的圆的面积
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> using namespace std; const int maxn = 1e5+100; const double eps = 1e-10; const double pi = acos(-1.0); struct point { double x,y; point() {} point(double _x,double _y) { x = _x; y = _y; } bool operator < (const point &b) const { if(y==b.y) return x<b.x; return y<b.y; } }a[maxn],ans[maxn]; double x_mul(point p0,point p1,point p2) { return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y); } double dis(point p1,point p2) { return sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)); } bool cmp(point t1,point t2) { double tmp = x_mul(a[0],t1,t2); if(tmp==0) return dis(a[0],t1)<dis(a[0],t2); else return tmp>0; } double graham(int n) { sort(a,a+n); sort(a+1,a+n,cmp); ans[0] = a[0]; ans[1] = a[1]; ans[2] = a[2]; int top = 2; for(int i=3;i<n;i++) { while(top>=2&&x_mul(ans[top-1],ans[top],a[i])<0) top--; ans[++top] = a[i]; } double res = 0; for(int i=0;i<top;i++) res += dis(ans[i],ans[i+1]); res += dis(ans[top],ans[0]); return res; } int main(void) { int n,x; scanf("%d %d",&n,&x); for(int i=0;i<n;i++) scanf("%lf %lf",&a[i].x,&a[i].y); double sum = graham(n)+2.0*x*pi; printf("%.0f\n",sum); return 0; }
相关文章推荐
- 【凸包 Graham法 点集排序】poj 1113 Wall
- POJ 1113 Wall (凸包+求周长)
- POJ 1113 wall (凸包)
- poj1113——Wall(凸包)
- poj 1113 Wall 凸包
- POJ 1113 Wall (凸包)
- poj 1113 Wall(Graham扫描法求凸包)
- POJ 1113 Wall(凸包周长)
- POJ 1113 Wall (凸包)
- POJ1113——WALL 凸包
- POJ1113 wall 简单凸包
- poj1113 Wall 凸包问题 官方数据
- POJ - 1113 Wall(计算几何凸包)
- POJ1113---Wall(基础计算几何:凸包入门)
- poj 1113 Wall (凸包模板题)
- POJ 1113 Wall 二维凸包
- poj 1113 Wall 凸包
- POJ--1113 -- Wall [使用卷包裹法求凸包] [Gift Wrapping]
- POJ 1113 WALL(凸包-计算几何)
- POJ 1113 Wall 凸包(模板题)