题目链接:http://codeforces.com/problemset/problem/801/D点击打开链接
You are given a convex polygon P with n distinct vertices p1, p2, ..., pn. Vertex pi 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.
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. Line i 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).
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 exceed 10 - 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 .
4 0 0 0 1 1 1 1 0
0.3535533906
6 5 0 10 0 12 -4 10 -8 5 -8 3 -4
1.0000000000
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个点 求最大的半径r使得每个点在半径为r的圆范围内任意移动构成的图形都为凸多边形
凸多边形的性质为所有角都小于180度
而一开始给的是多边形
我们就判断每个点跟其相邻两点所构成的直线的距离 只要点不越过那条直线 则角度小于180度 然后取距离最小的即可
另外附两个公式
#include <bits/stdc++.h>
using namespace std;
double x[1111];
double y[1111];
double dis(double A,double B,double C,int pos)
{
return abs((A*x[pos]+B*y[pos]+C)/sqrt(A*A+B*B));
}
double cal(int pos1,int pos2,int pos3)
{
return dis(y[pos3]-y[pos1],x[pos1]-x[pos3],x[pos3]*y[pos1]-x[pos1]*y[pos3],pos2);
}
int main()
{
int n;
cin >> n;
double ans=1e18;
for(int i=0;i<n;i++)
{
cin >> x[i] >> y[i];
}
for(int i=0;i<n;i++)
{
ans=min(ans,cal((i+n-1)%n,i,(i+1)%n));
}
printf("%.10f",ans/2);
}