Codeforces Round #409 (Div. 2) D Volatile Kite

题意:给一个凸多边形(顺时针方向),对每个点任意移动距离D,求最大的D使得这个多边形一直是凸多边形。

思路:容易发现对于凸多边形相邻的三个点。。pi,pi+1,pi+2。。pi+1到直线pi,pi+2的距离除以2就是这组点所能接受的最大值。这n组点的最小值就是答案。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
struct Point{
    double x , y;
}p[maxn];
int n;
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%lf%lf",&p[i].x,&p[i].y);
    p[n + 1].x = p[1].x , p[n + 1].y = p[1].y;
    p[n + 2].x = p[2].x , p[n + 2].y = p[2].y;
    double ans = 10000000088 ;
    for(int i = 3;i<=n+2;i++){
        double A = p[i - 2].y-p[i].y; double B = p[i].x - p[i - 2].x; double C = p[i-2].x*p[i].y - p[i].x * p[i - 2].y;
        double d = A * p[i-1].x + B * p[i - 1].y + C;
        if(d < 0) d=-d;
        double dd = sqrt(A * A + B * B);
        d = d / dd;
        d/=2;
        ans = min(d , ans);
    }
    printf("%.8f
",ans);
}
原文地址:https://www.cnblogs.com/rtyfcvb/p/6722791.html