zoukankan      html  css  js  c++  java
  • POJ1113 Wall 凸包

    题目大意:建立围墙将城堡围起来,要求围墙至少距离城堡L,拐角处用圆弧取代,求围墙的长度。

    题目思路:围墙长度=凸包周长+(2*PI*L),另外不知道为什么C++poj会RE,G++就没问题。

    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<iostream>
    #include<algorithm>
    #include<cstring>
    #include<vector>
    #include<queue>
    #define INF 0x3f3f3f3f
    #define MAX 100005
    #define PI acos(-1)
    using namespace std;
    
    struct node
    {
        int x,y;
    }point[MAX];
    
    int Stuck[MAX],n,l,top;
    
    bool cmp(struct node A,struct node B)
    {
        if(A.y < B.y)
            return true;
        if(A.y==B.y && A.x<B.x)
            return true;
        return false;
    }
    
    int Cross(int x1,int y1,int x2,int y2,int x3,int y3)
    {
        return (x1-x2)*(y1-y3)-(x1-x3)*(y1-y2);
    }
    
    void Graham()
    {
        memset(Stuck,0,sizeof(Stuck));
        Stuck[0]=0;
        Stuck[1]=1;
        top=1;
        for(int i=2;i<n;i++)
        {
            while(top>0 && Cross(point[Stuck[top]].x,point[Stuck[top]].y,point[Stuck[top-1]].x,point[Stuck[top-1]].y,point[i].x,point[i].y)<=0)
                top--;
             Stuck[++top]=i;
        }
        int len=top;
        Stuck[++top]=n-2;
        for(int i=n-3;i>=0;i--)
        {
            while(top!=len && Cross(point[Stuck[top]].x,point[Stuck[top]].y,point[Stuck[top-1]].x,point[Stuck[top-1]].y,point[i].x,point[i].y)<=0)
                top--;
            Stuck[++top]=i;
        }
    }
    
    double Dist(int pos1,int pos2)
    {
        return sqrt((point[pos1].x-point[pos2].x)*(point[pos1].x-point[pos2].x)*1.0+(point[pos1].y-point[pos2].y)*(point[pos1].y-point[pos2].y));
    }
    
    int main()
    {
        int k;
        while(scanf("%d%d",&n,&l)!=EOF)
        {
            k=0;
            for(int i=0;i<n;i++)
            {
                scanf("%d%d",&point[i].x,&point[i].y);
                if(point[k].y > point[i].y || (point[k].x>point[i].x && point[k].y==point[i].y))
                    k=i;
            }
            swap(point[0],point[k]);
            sort(point+1,point+n,cmp);
            Graham();
            double sum=0;
            sum+=Dist(Stuck[0],Stuck[top])+2*PI*l;
            for(int i=1;i<=top;i++)
                sum+=Dist(Stuck[i],Stuck[i-1]);
            int ans=(int)(sum+0.5);
            printf("%d
    ",ans);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    opencv入门踩坑之路(一)
    编写vue的时候(html也一样),限制一个div内可显示的字数
    win10开机后内存占用非常高,但是资源管理器显示的进程占用得很少,可以考虑更新驱动
    java 随机数产生 常用类及方法
    你不会的是这个正则表达式吗?
    系统编程第三次上机
    Java第三次上机随笔
    系统编程第二次实验
    Java第二次上机随笔
    面向对象-Java MOOC翁恺老师第一次作业
  • 原文地址:https://www.cnblogs.com/alan-W/p/6030530.html
Copyright © 2011-2022 走看看