Wall--POJ1113(极角排序+求凸包)

http://poj.org/problem?id=1113

题目大意:现在要给n个点,让你修一个围墙把这些点围起来,距离最小是l

分析  :现在就是求凸包的周长然后再加上一个圆的周长

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<queue>

using namespace std;
#define N 1005
#define pi acos(-1.0)
#define ESP 1e-8

int s[N];

struct Point
{
    double x,y;
    Point(double x=0,double y=0):x(x),y(y){}
    Point operator - (const Point &temp)const
    {
        return Point(x-temp.x,y-temp.y);
    }
    Point operator + (const Point &temp)const
    {
        return Point(x+temp.x,y+temp.y);
    }
    bool operator == (const Point &temp)const
    {
        return (x==temp.x && y==temp.y);
    }
    double operator * (const Point &temp)const
    {
        return (x*temp.x+y*temp.y);
    }
    int operator ^ (const Point &temp)const{
        double t=x*temp.y-y*temp.x;
        if(t>ESP)
            return 1;
        if(fabs(t)<ESP)
            return 0;
        return -1;
    }
}a[N];

double dist(Point a,Point b)
{
    return sqrt((a-b)*(a-b));
}

int cmp(Point a1,Point a2)
{
    int t=((a1-a[0])^(a2-a[0]));
    if(t==0)
        return dist(a1,a[0])<dist(a2,a[0]);
    else
        return t>0;
}
int top;
void Graham(int n)///求凸包
{
    s[0]=0;
    s[1]=1;
    top=1;
    for(int i=2;i<n;i++)
    {
        while(top>0 && ((a[i]-a[s[top]])^(a[s[top-1]]-a[s[top]]))<=0)
            top--;
        s[++top]=i;
    }

}

int main()
{
    int n,l;
    while(scanf("%d %d",&n,&l)!=EOF)
    {
        memset(s,0,sizeof(s));
        int k=0;
        for(int i=0;i<n;i++)
        {
            scanf("%lf %lf",&a[i].x,&a[i].y);
            if(a[i].y<a[k].y || (a[i].y==a[k].y && a[i].x<a[k].x))
                k=i;
        }
        swap(a[0],a[k]);
        sort(a+1,a+n,cmp);

        Graham(n);
        double C=0;
        for(int i=1;i<=top;i++)
        {
            C+=dist(a[s[i]],a[s[i-1]]);
        }
        C+=dist(a[s[0]],a[s[top]]);
        C+=2*pi*l;
        printf("%.0lf\n",C);
    }
    return 0;
}
时间: 2024-10-03 14:03:23

Wall--POJ1113(极角排序+求凸包)的相关文章

POJ 1113 Wall 卷包裹法求凸包

Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31199   Accepted: 10521 Description Once upon a time there was a greedy King who ordered his chief Architect to build a wall around the King's castle. The King was so greedy, that he w

极角排序+求锐角三角形个数——uva12123

这个版本还不能处理三点共线的情况(处理起来其实比较麻烦) 可以用atan2来排序(较为简单,但是精度误差大),也可以用叉积排序(比较优秀) atan2 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; typedef

Wall - POJ 1113(求凸包)

题目大意:给N个点,然后要修建一个围墙把所有的点都包裹起来,但是要求围墙距离所有的点的最小距离是L,求出来围墙的长度. 分析:如果没有最小距离这个条件那么很容易看出来是一个凸包,然后在加上一个最小距离L,那么就是在凸包外延伸长度为L,如下图,很明显可以看出来多出来的长度就是半径为L的圆的周长,所以总长度就是凸包的周长+半径为L的圆的周长. 代码如下: -------------------------------------------------------------------------

简单几何(极角排序) POJ 2007 Scrambled Polygon

题目传送门 题意:裸的对原点的极角排序,凸包貌似不行. /************************************************ * Author :Running_Time * Created Time :2015/11/3 星期二 14:46:47 * File Name :POJ_2007.cpp ************************************************/ #include <cstdio> #include <al

10.1 叉积 ,极角排序,扫描法求凸包

凸包:用一个凸多边形将所有点围起来,这个凸多边形就是凸包 1.先要引入一个数学工具,向量叉积   |c|=|a×b|=|a| |b|sinα   (α为a,b向量之间的夹角) 则 |c| 为向量a ,b所组成的平行四边形的面积 这里是用叉积判断两向量的相对位置关系(非常有用!) 则 a x b < 0 (a在b的逆时针方向 ) , b x a > 0(b在a的顺时针方向) //求叉积 struct node{ double x ,y; node operator -( const node &

(模板)poj1113(graham扫描法求凸包)

题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是kuangbin的. AC code: #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn=1005; const double PI=

(hdu 7.1.7)Wall(求凸包的周长——求将所有点围起来的最小凸多边形的周长)

题目: Wall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 119 Accepted Submission(s): 47   Problem Description Once upon a time there was a greedy King who ordered his chief Architect to build a wa

(hdu step 7.1.7)Wall(求凸包的周长——求将全部点围起来的最小凸多边形的周长)

题目: Wall Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 119 Accepted Submission(s): 47   Problem Description Once upon a time there was a greedy King who ordered his chief Architect to build a wa

【计算几何】【凸包】【极角排序】【二分】Gym - 101128J - Saint John Festival

平面上n个红点,m个黑点,问你多少个黑点至少在一个红三角形内. 对红点求凸包后,转化为询问有多少个黑点在凸包内. 点在凸多边形内部判定,选定一个凸包上的点作原点,对凸包三角剖分,将其他的点极角排序之后,使用二分法就可以判定点在哪个剖分出来的三角形的夹角内,然后用叉积即可判定其在凸包内还是外,O(logn): http://www.cnblogs.com/dream-wind/archive/2012/05/23/2514694.html #include<cstdio> #include<