CodeForces
来源:互联网 发布:2000年流行网络歌曲 编辑:程序博客网 时间:2024/06/05 09:44
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.
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 integersxi andyi ( - 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 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.
40 00 11 11 0
0.3535533906
65 010 012 -410 -85 -83 -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个点,n<=1e3,组成的凸多边形,求出最大的D,使得任意点按任意方向移动不超过D后,n个点依然组成凸多边形.
本题的关键是用到凸多边形的每个角都小于180度的性质。
图像转载:http://blog.csdn.net/jeremy1149/article/details/70231644
答案为min(每个点的到直线的距离的一半)
#include<iostream>#include<cmath>#include<cstring>#include<cstdio>#include<vector>#include<stack>#include<queue>#include<algorithm>#include<sstream>#define inf 0x3f3f3f3f#define ll long longusing 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;}
- codeforces~~~
- Codeforces
- codeforces
- Codeforces
- codeforces
- codeforces
- Codeforces
- Codeforces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- CodeForces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Codeforces
- Size_t和int区别
- 整理比较Java集合类(List,Set, Queue, Map)
- Kafka笔记二之Topic操作,文件参数配置
- 2017河工大邀请赛G题_1266: 最大子段和_Dp
- 剑指offer-面试题35-第一个只出现一次的字符
- CodeForces
- 辗转相除法求最大公约数,最小公倍数。
- 普通接收函数的改进(时间片->线程实现)
- 6. ZigZag Conversion 题解
- LeetCode之路:104. Maximum Depth of Binary Tree
- 随笔之设计模式(一)
- 项目中用到的一些git命令(持续更新)
- Linux基础分区和格式化
- [Python爬虫]爬取东方财富网公司公告需要注意的几个问题