题意:给一个凸多边形(顺时针方向),对每个点任意移动距离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\n",ans); }