Wall
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 43274   Accepted: 14716

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 would not listen to his Architect's proposals to build a beautiful brick wall with a perfect shape and nice tall towers. Instead, he ordered to build the wall around the whole castle using the least amount of stone and labor, but demanded that the wall should not come closer to the castle than a certain distance. If the King finds that the Architect has used more resources to build the wall than it was absolutely necessary to satisfy those requirements, then the Architect will loose his head. Moreover, he demanded Architect to introduce at once a plan of the wall listing the exact amount of resources that are needed to build the wall. 

Your task is to help poor Architect to save his head, by writing a program that will find the minimum possible length of the wall that he could build around the castle to satisfy King's requirements. 

The task is somewhat simplified by the fact, that the King's castle has a polygonal shape and is situated on a flat ground. The Architect has already established a Cartesian coordinate system and has precisely measured the coordinates of all castle's vertices in feet.

Input

The first line of the input file contains two integer numbers N and L separated by a space. N (3 <= N <= 1000) is the number of vertices in the King's castle, and L (1 <= L <= 1000) is the minimal number of feet that King allows for the wall to come close to the castle. 

Next N lines describe coordinates of castle's vertices in a clockwise order. Each line contains two integer numbers Xi and Yi separated by a space (-10000 <= Xi, Yi <= 10000) that represent the coordinates of ith vertex. All vertices are different and the sides of the castle do not intersect anywhere except for vertices.

Output

Write to the output file the single number that represents the minimal possible length of the wall in feet that could be built around the castle to satisfy King's requirements. You must present the integer number of feet to the King, because the floating numbers are not invented yet. However, you must round the result in such a way, that it is accurate to 8 inches (1 foot is equal to 12 inches), since the King will not tolerate larger error in the estimates.

Sample Input

9 100
200 400
300 400
300 300
400 300
400 400
500 400
500 200
350 200
200 200

Sample Output

1628

Hint

结果四舍五入就可以了
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
using namespace std; const int MAXN =1010;
const double PI= acos(-1.0);
//精度
double eps=1e-8;
//避免出现-0.00情况,可以在最后加eps
//精度比较
int sgn(double x)
{
if(fabs(x)<=eps)return 0;
if(x<0)return -1;
return 1;
} //点的封装
struct Point
{
double x,y;
Point (){}
//赋值
Point (double _x,double _y)
{
x=_x;
y=_y;
}
//点相减
Point operator -(const Point &b)const
{
return Point (x-b.x,y-b.y);
}
//点积
double operator *(const Point &b)const
{
return x*b.x+y*b.y;
}
//叉积
double operator ^(const Point &b)const
{
return x*b.y-y*b.x;
}
} ; //线的封装
struct Line
{
Point s,e;
Line (){}
Line (Point _s,Point _e)
{
s=_s;
e=_e;
}
//平行和重合判断 相交输出交点
//直线相交和重合判断,不是线段,
Point operator &(const Line &b)const{
Point res=b.s;
if(sgn((e-s)^(b.e-b.s))==0)
{
if(sgn((e-s)^(e-b.e))==0)
{
//重合
return Point(0,0);
}
else
{
//平行
return Point(0,0);
}
}
double t=((e-s)^(s-b.s))/((e-s)^(b.e-b.s));
res.x+=(b.e.x-b.s.x)*t;
res.y+=(b.e.y-b.s.y)*t;
return res;
}
}; //向量叉积
double xmult(Point p0,Point p1,Point p2)
{
return (p0-p1)^(p2-p1);
} //线段和线段非严格相交,相交时true
//此处是线段
bool seg_seg(Line l1,Line l2)
{
return sgn(xmult(l1.s,l2.s,l2.e)*xmult(l1.e,l2.s,l2.e))<=0&&sgn(xmult(l2.s,l1.s,l1.e)*xmult(l2.e,l1.s,l1.e))<=0;
} //两点之间的距离
double dist(Point a,Point b)
{
return sqrt((a-b)*(a-b));
} //极角排序;对100个点进行极角排序
int pos;//极点下标
Point p[MAXN];
int Stack[MAXN],top;
bool cmp(Point a,Point b)
{
double tmp=sgn((a-p[pos])^(b-p[pos]));//按照逆时针方向进行排序
if(tmp==0)return dist(a,p[pos])<dist(b,p[pos]);
if(tmp<0)return false ;
return true;
}
void Graham(int n)
{
Point p0;
int k=0;
p0=p[0];
for(int i=1;i<n;i++)//找到最左下边的点
{
if(p0.y>p[i].y||(sgn(p0.y-p[i].y))==0&&p0.x>p[i].x)
{
p0=p[i];
k=i;
}
}
swap(p[k],p[0]);
sort(p+1,p+n,cmp);
if(n==1)
{
top=2;
Stack[0]=0;
return ;
}
if(n==2)
{
top=2;
Stack[0]=0;
Stack[1]=1;
return ;
}
Stack[0]=0;Stack[1]=1;
top=2;
for(int i=2;i<n;i++)
{
while(top>1&&sgn((p[Stack[top-1]]-p[Stack[top-2]])^(p[i]-p[Stack[top-2]]))<=0)
top--;
Stack[top++]=i;
}
} int main ()
{
int n,l;
cin>>n>>l;
for(int i=0;i<n;i++)
cin>>p[i].x>>p[i].y;
Graham(n);
double sum=0;
for(int i=0;i<top-1;i++)
sum+=dist(p[Stack[i]],p[Stack[i+1]]);
sum+=dist(p[Stack[top-1]],p[Stack[0]]);
sum+=PI*2*l;
sum=(sum)*10/10;
printf("%.f\n",sum);
return 0;
}

poj 1113 wall(凸包裸题)(记住求线段距离的时候是点积,点积是cos)的更多相关文章

  1. POJ 1113 Wall 凸包 裸

    LINK 题意:给出一个简单几何,问与其边距离长为L的几何图形的周长. 思路:求一个几何图形的最小外接几何,就是求凸包,距离为L相当于再多增加上一个圆的周长(因为只有四个角).看了黑书使用graham ...

  2. poj 1113 Wall 凸包的应用

    题目链接:poj 1113   单调链凸包小结 题解:本题用到的依然是凸包来求,最短的周长,只是多加了一个圆的长度而已,套用模板,就能搞定: AC代码: #include<iostream> ...

  3. POJ 1113 Wall 凸包求周长

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26286   Accepted: 8760 Description ...

  4. POJ 1113 - Wall 凸包

    此题为凸包问题模板题,题目中所给点均为整点,考虑到数据范围问题求norm()时先转换成double了,把norm()那句改成<vector>压栈即可求得凸包. 初次提交被坑得很惨,在GDB ...

  5. POJ 1113 Wall(思维 计算几何 数学)

    题意 题目链接 给出平面上n个点的坐标.你需要建一个围墙,把所有的点围在里面,且围墙距所有点的距离不小于l.求围墙的最小长度. \(n \leqslant 10^5\) Sol 首先考虑如果没有l的限 ...

  6. POJ 1087 最大流裸题 + map

    A Plug for UNIX Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 15597   Accepted: 5308 ...

  7. poj 1113:Wall(计算几何,求凸包周长)

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28462   Accepted: 9498 Description ...

  8. POJ 1113 Wall 求凸包的两种方法

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31199   Accepted: 10521 Descriptio ...

  9. POJ 1113 Wall 求凸包

    http://poj.org/problem?id=1113 不多说...凸包网上解法很多,这个是用graham的极角排序,也就是算导上的那个解法 其实其他方法随便乱搞都行...我只是测一下模板... ...

随机推荐

  1. 非root用户安装centos的jdk

    1. 下载linux的jdk到自定义目录(以下简称安装目录),解压. 2. 在安装目录下新建文件局部环境变量文件:bash_profile 内容为:(注意修改JAVA_HOME目录) export J ...

  2. LeetCode220 存在重复元素 III

    给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ. 示例 1: 输入: ...

  3. 区间合并 C++

    #include <iostream> #include <vector> #include <algorithm> using namespace std; ty ...

  4. 十三:SQL注入之MYSQL注入

    MYSQL注入中首先要明确当前注入点权限,高权限注入时有更多的攻击手法,有的能直接进行getshell操作,其中也会遇到很多的阻碍,相关防御手法也要明确,所谓知己知彼,百战不殆.作为安全开发工作者,攻 ...

  5. 【Linux】查看系统僵尸进程

    ps -ef|grep -v grep|grep defunct 如果这个有显示内容的话,可以手动将进程kill掉即可 ---------------------------------------- ...

  6. Android事件分发机制三:事件分发工作流程

    前言 很高兴遇见你~ 本文是事件分发系列的第三篇. 在前两篇文章中,Android事件分发机制一:事件是如何到达activity的? 分析了事件分发的真正起点:viewRootImpl,Activit ...

  7. 【Android】关于连续多次点击控件的控制方案(新建监听类)

    参考:防止Android过快点击造成多次事件的三种方法_胖胖的博客-CSDN博客 实现逻辑很简单: 设置限定时间 在用户点击时开始计时 若计时未超过限定时间,则不允许触发点击事件 因还未学习过Rxja ...

  8. Ubuntu源、Python虚拟环境及pip源配置

    Ubuntu 命令行更改源 在修改source.list前,最好先备份一份 软件源的地址配置文件在 /etc/apt/sources.list 执行备份命令 sudo cp /etc/apt/sour ...

  9. MAX232数据方向

    在调试一个新板子的时候,串口调试从来都是放在前面的,而由于是一个新板子,电路图也是新的,因此有时候不知道串口线结对了没有,这个时候可能会对照PCB和原理图去看一下,但有时候看的人会很迷糊,因为不同的人 ...

  10. NodeJS连接MongoDB数据库

    NodeJS连接MongoDB数据库 连接数据库的js文件[我将其命名为(connect.js)] // 引入mongoose第三方模块 const mongoose = require('mongo ...