Codeforces 801D Volatile Kite 几何

来源:互联网 发布:计算机网络就业 知乎 编辑:程序博客网 时间:2024/05/19 12:18

点击打开链接

题意:按顺时针给出n个点,n<=1e3,组成的凸多边形,求出最大的D,使得任意点按任意方向移动不超过D后,n个点依然组成凸多边形.
凸多边形:内角都<=180, 
问题转化一下:求最小D使得多边形non-convex,则改变一个内角,使得它>180 
由下图(来自Codeforces题解)知道,答案为:min(点B->直线AC距离的1/2) ,改变的是内角,则ABC为连续的三点 
计算点B到直线AC距离用到叉积 d=AB叉积AC/|AC| (四边形面积/底) 


#include <bits/stdc++.h>using namespace std;const int N=2e5+20;const double eps=1e-10;const double PI=acos(-1.0);struct point{double x,y;}p[N];double length(point p1,point p2){double dx=p1.x-p2.x;double dy=p1.y-p2.y;return sqrt(dx*dx+dy*dy);}double cross(point p0,point p1,point p2){return abs((p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x));}int main(){int n;while(cin>>n){for(int i=1;i<=n;i++)cin>>p[i].x>>p[i].y;double ans=1e15;for(int i=1;i<=n;i++){int j=i-1,k=i+1;if(j==0)j=n;if(k==n+1)k=1;double res=cross(p[j],p[i],p[k]);double val=length(p[j],p[k]);//ans=min(ans,res/val);}printf("%.10lf\n",ans/2.0);}return 0;}



0 0
原创粉丝点击