hdu 1348 Wall 凸包模板题
2013-09-13 19:09
302 查看
#include <cstdio> #include <cstring> #include <cmath> #include <queue> #include <iostream> #include <algorithm> using namespace std; const int maxn=1010; const double pi=atan(1.0)*4; struct node{ int x,y; }e[maxn],res[maxn]; int cmp(node a,node b) { if(a.x==b.x)return a.y<b.y; return a.x<b.x; } int cross(node a,node b,node c)//向量积 { return (a.x-c.x)*(b.y-c.y)-(b.x-c.x)*(a.y-c.y); } int convex(int n)//求凸包上的点 { sort(e,e+n,cmp); int m=0,i,j,k; //求得下凸包,逆时针 //已知凸包点m个,如果新加入点为i,则向量(m-2,i)必定要在(m-2,m-1)的逆时针方向才符合凸包的性质 //若不成立,则m-1点不在凸包上。 for(i=0;i<n;i++) { while(m>1&&cross(res[m-1],e[i],res[m-2])<=0)m--; res[m++]=e[i]; } k=m; //求得上凸包 for(i=n-2;i>=0;i--) { while(m>k&&cross(res[m-1],e[i],res[m-2])<=0)m--; res[m++]=e[i]; } if(n>1)m--;//起始点重复。 return m; } double lenght(node a,node b) { return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } int main() { int T,n,l; scanf("%d",&T); while(T--) { int i,j,k,m; scanf("%d%d",&n,&l); for(i=0;i<n;i++) scanf("%d%d",&e[i].x,&e[i].y); m=convex(n); double ans=0; for(i=1;i<m;i++) ans+=lenght(res[i],res[i-1]); ans+=lenght(res[m-1],res[0]); ans+=2*pi*l; printf("%.0lf\n",ans); if(T!=0) printf("\n"); } return 0; } /* 题意是,求得n个点的凸包,然后求与凸包相距l的外圈的周长。 方法: 画图可知,最后所求周长等于凸包周长+半径为l的圆周长。 */
相关文章推荐
- hdu1348 Wall(凸包模板题)
- HDU 1348 Wall(凸包模板题)
- hdu 1348 Wall (凸包模板)
- hdu 1348 Wall(凸包模板)
- hdu 1348 Wall (凸包模板)
- hdu 1348 Wall (凸包模板)
- hdu 1348 Wall(凸包模板题 Graham)
- hdu 1348 Wall(凸包模板题)
- HDU 1348 wall 凸包模板题 求周长
- HDU 1348 Wall 凸包的周长
- hdu 1348 Wall (凸包)
- hdu_1348_Wall(凸包)
- HDU-1348 Wall 凸包
- POJ 1113 && HDU 1348 Wall(凸包)
- hdu_1348_Wall(凸包)
- HDU 1348 (凸包模板之卷包裹)
- hdu 1348 wall (计算几何,凸包)
- hdu 1348【凸包模板】
- HDU1348 Wall 凸包
- POJ 1113 || HDU 1348: wall(凸包问题)