Poj1113 Wall

原创 2016年06月01日 20:48:31

有个由N个点组成的多边形,现在要在这个多边形外至少L的距离修围墙,求围墙长度最短多少。
感受一下,就是凸包周长加上一个圆周长。
问:凹下去的怎么办?
答:凹下去就长了。

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn = 1005;
#define INF 1e9
#define EPS 1e-6
struct point {
    int x,y;
    point(){}
    point(int _x,int _y) :x(_x),y(_y){}
    point operator - (const point &a) {return point(x-a.x,y-a.y);}
};
int cross(point a,point b) {return a.x*b.y-a.y*b.x;}
double dis(point a,point b) {point c=a-b;return sqrt(1.0*c.x*c.x+1.0*c.y*c.y);}
bool cmp(point a,point b) {return a.x<b.x || (a.x==b.x && a.y<b.y);}
point P[maxn],hull[maxn];
int cnt=0;
int s[maxn];
int N,L;
void quickhull(int L,int R,point a,point b) {
    int x=L,i=L-1,j=R+1;
    for(int k = L; k <= R; k++ ) if( s[k] > s[x] || (s[x]==s[k] && cmp(P[x],P[k])))x=k;
    point y = P[x];
    for(int k = L; k <= R; k++ ) {
        s[++i] = cross(a-P[k],y-P[k]);
        if( s[i] > 0 ) swap(P[i],P[k]); else i--;
    }
    for(int k = R; k >= L; k-- )  {
        s[--j] = cross(y-P[k],b-P[k]);
        if( s[j] > 0 ) swap(P[j],P[k]); else j++;
    }
    if( L <= i ) quickhull(L,i,a,y);
    hull[++cnt] = y;
    if( j <= R ) quickhull(j,R,y,b);
}
int main() {
    scanf("%d%d",&N,&L);
    int x = 0;
    P[0] = point(INF,INF);
    for(int i = 1; i <= N; i++) {
        scanf("%d%d",&P[i].x,&P[i].y);
        if( cmp(P[i],P[x])) x=i;
    }
    swap(P[1],P[x]);
    hull[++cnt] = P[1];
    quickhull(2,N,P[1],P[1]);
    double ans = 3.1415926*2.0*L;
    hull[++cnt] = P[1];
    for(int i = 2; i <= cnt; i++) ans += dis(hull[i],hull[i-1]);
    printf("%.0lf\n",ans);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

poj1113Wall【凸包】

Language: Default Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissio...
  • R1986799047
  • R1986799047
  • 2015年09月06日 13:38
  • 930

POJ 1113 Wall 凸包(模板题)

用不严谨的话来讲,给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点。 题意:给出n个点 n=L? 若不考虑L 则答案为凸包的周长,考虑条件L,由如下图形...
  • Jeremy1149
  • Jeremy1149
  • 2017年04月18日 15:50
  • 386

poj1113 - Wall

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                              ...
  • wangjian8006
  • wangjian8006
  • 2012年08月13日 09:59
  • 634

poj1113——Wall

Graham扫描法: •对于一个有三个或以上点的点集Q,令p0为Q中Y-X坐标排序下最小的点设为对其余点按以p0为中心的极角逆时针排序所得的点集。压p0进栈S,压p1进栈S,压p2进栈Sfor(i=3...
  • k1246195917
  • k1246195917
  • 2010年09月12日 11:18
  • 268

poj1113 wall

A - Wall Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:10000KB     ...
  • bigsungod
  • bigsungod
  • 2014年08月01日 11:23
  • 385

【poj1113】 Wall

http://poj.org/problem?id=1113 (题目链接)题意:给定多边形城堡的n个顶点,绕城堡外面建一个围墙,围住所有点,并且墙与所有点的距离至少为L,求这个墙最小的长度。Solut...
  • MashiroSky
  • MashiroSky
  • 2016年08月08日 19:23
  • 133

poj1113 Wall

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35478   Accepted...
  • qq_33362864
  • qq_33362864
  • 2016年09月13日 10:24
  • 121

POJ1113:Wall

POJ1113求完凸包算总长度,然后+2piL。结束。 我还sb的把每个角都求了一遍加起来。。后来发现其实就是360°。 重要的事情说三遍:用C++!用C++!用C++!【代码】#include ...
  • Ep1C_HeReT1c
  • Ep1C_HeReT1c
  • 2017年05月17日 18:51
  • 58

POJ1113 Wall

POJ 1113 Wall 其实就是凸包长度加上半径长度为R的园的周长。 #include #include #include #include #include #include using ...
  • utoppia
  • utoppia
  • 2013年08月19日 21:20
  • 404

POJ1113 Wall 凸包

Description Once upon a time there was a greedy King who ordered his chief Architect to build a...
  • a305657
  • a305657
  • 2013年01月31日 22:44
  • 314
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Poj1113 Wall
举报原因:
原因补充:

(最多只允许输入30个字)