即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

CodeForces – 801D 凸多边形的性质

编程语言 winycg 10℃ 0评论




You are given a convex polygon
P
with n distinct verticesp1, p2, …, pn.
Vertexpi has coordinates(xi, yi) in the 2D plane.
These vertices are listed in clockwise order.

You can choose a real number
D
and move each vertex of the polygon a distance of at most
D
from their original positions.

Find the maximum value of
D
such that no matter how you move the vertices, the polygon does not intersect itself and stays convex.

Input

The first line has one integer
n
(4 ≤ n ≤ 1 000) — the number of vertices.

The next n lines contain the coordinates of the vertices. Linei contains two integers
xi and
yi ( - 109 ≤ xi, yi ≤ 109)
— the coordinates of the i-th vertex. These points are guaranteed to be given in clockwise order, and will form a strictly convex polygon (in particular, no three consecutive points lie on the same straight line).

Output

Print one real number D, which is the maximum real number such that no matter how you move the vertices, the polygon stays convex.

Your answer will be considered correct if its absolute or relative error does not exceed10 - 6.

Namely, let’s assume that your answer is
a
and the answer of the jury is b. The checker program will consider your answer correct if.

Example
Input
4
0 0
0 1
1 1
1 0
Output
0.3535533906
Input
6
5 0
10 0
12 -4
10 -8
5 -8
3 -4
Output
1.0000000000
Note

Here is a picture of the first sample

Here is an example of making the polygon non-convex.

This is not an optimal solution, since the maximum distance we moved one point is ≈ 0.4242640687, whereas we can make it non-convex by only moving each point a distance of at most ≈ 0.3535533906




题意:按顺时针给出n个点,n<=1e3,组成的凸多边形,求出最大的D,使得任意点按任意方向移动不超过D后,n个点依然组成凸多边形.

本题的关键是用到凸多边形的每个角都小于180度的性质。

图像转载:http://blog.csdn.net/jeremy1149/article/details/70231644




答案为min(每个点的到直线的距离的一半)

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
#define ll long long
using namespace std;
struct point
{
    double x;
    double y;
    point(){}
    point(double x,double y):x(x),y(y) {}
}q[1010];
typedef point Vector;
Vector operator - (point a,point b)
{
    return Vector(a.x-b.x,a.y-b.y);
}
double Length(Vector a)
{
    return sqrt(a.x*a.x+a.y*a.y);
}
double cross(Vector a,Vector b)
{
    return a.x*b.y-a.y*b.x;
}
double DistanceToLine(point p,point a,point b)
{
    Vector v1=b-a;
    Vector v2=p-a;
    return fabs(cross(v1,v2))/Length(v1);
}
int main()
{
    int n;
    while(cin>>n)
    {
        for(int i=1;i<=n;i++)
            scanf("%lf%lf",&q[i].x,&q[i].y);
        double minx=1e18;
        for(int i=1;i<=n;i++)
        {
            if(i==1)
                minx=min(minx,DistanceToLine(q[i],q[n],q[i+1]));
            else if(i==n)
                minx=min(minx,DistanceToLine(q[i],q[i-1],q[1]));
            else
                minx=min(minx,DistanceToLine(q[i],q[i-1],q[i+1]));
        }
        printf("%0.10f\n",minx/2);
    }
    return 0;
}









转载请注明:CodingBlog » CodeForces – 801D 凸多边形的性质

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情