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);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

poj 1113 Wall 计算几何 凸包 Graham扫描

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35684   Accepted: 12177 ...

POJ 1113 Wall(凸包应用)

POJ 1113 Wall(凸包应用) http://poj.org/problem?id=1113 题意: ZOJ1456        给你一个多边形X的所有点,要你用一个另一个图形A把这个...

POJ 1113-Wall(凸包-Graham算法)

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35509   Accepted...
  • MIKASA3
  • MIKASA3
  • 2016年09月21日 20:24
  • 322

HDU 1348 && POJ 1113 Wall(凸包)

题目链接:HDU :http://acm.hdu.edu.cn/showproblem.php?pid=1348 POJ :http://poj.org/problem?id=1113题解:求出凸包...

Wall_poj1113_凸包

DescriptionOnce upon a time there was a greedy King who ordered his chief Architect to build a wall ...
  • jpwang8
  • jpwang8
  • 2016年09月16日 18:54
  • 227

POJ 1113 Wall (凸包周长)

http://poj.org/problem?id=1113 使用Graham-Scan算法。 为什么扫描阶段的复杂度是O(n)的? 因为在扫描的过程中,每个点至多进栈一次,至多出栈一次,也就是说...

poj1113 Wall

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 35478   Accepted...

POJ 1113 && HDU 1348 Wall (凸包周长 graham扫描法)

POJ 1113 && HDU 1348 Wall (凸包周长 graham扫描法)

POJ--1113[Wall] 凸包周长+圆的周长

题目大意:给你N个点的坐标和一个距离限制L,让你求出1.包含所有点,2.且不能小于L;的最小周长。 思路分析:其实就是凸包周长+圆的周长。。。。(直接套模版)。。。1A.。。。 感想:做几何题模版很重...

zoj 1465 || poj 1113 Wall

看论文的时候看到的题,给你一个多边形,需要用最少的离这个多边形远为L的墙围住。凸包的话是距离最短的。画图的话,可知,拐角部分都是圆弧,整个一周下来正好是半径为L的圆的周长。所以结果就是凸包周长+圆周长...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Poj1113 Wall
举报原因:
原因补充:

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