hdu1348 Wall(凸包)

来源:互联网 发布:冒泡排序c语言详解 编辑:程序博客网 时间:2024/06/05 06:20

hdu1348

题目

求把给定点围起来的最小周长,其中围墙离点要有L的距离。

思路

挺近凸包,从(抄)模版做起!

代码

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;typedef long long ll;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,k;    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 length(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--)    {        scanf("%d %d",&n,&l);        for(int i=0; i<n; i++)        {            scanf("%d %d",&e[i].x,&e[i].y);        }        int m=convex(n);        double ans=0;        for(int i=1; i<m; i++)            ans+=length(res[i],res[i-1]);        ans+=length(res[m-1],res[0]);        ans+=(double)2*pi*l;        printf("%.0lf\n",ans);        if(T!=0)            printf("\n");    }    return 0;}
0 0
原创粉丝点击