CodeForces 772B Volatile Kite

来源:互联网 发布:python面试常问问题 编辑:程序博客网 时间:2024/05/29 03:20

题目链接:http://codeforces.com/problemset/problem/772/B
题意:给你一个凸n多边形,如果任意点移动d的距离会使得这个凸n多边形不再是凸n多边形,让你求这个距离d的最小值
解析:如果一个点移动一段距离以后,这个多边形就不再是凸n多边形的话,只有可能这个点和旁边的两个点形成了一条直线,那么这个d就是这个点到旁边两个点形成的直线的最短距离,可是其他点也可以移动,那么就相当于这三个点都往中间靠,所以ans = min(点到直线的距离/2.0)

#include <bits/stdc++.h>using namespace std;const int inf = 0x7fffffff;const double eps = 1e-6;const int maxn = 1e5+100;struct point{    double x,y;    point() {}    point(double _x,double _y)    {        x = _x;        y = _y;    }}a[maxn];double x_mul(point p0,point p1,point p2){    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);}double dis(point p1,point p2){    return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));}int main(void){    int n;    scanf("%d",&n);    for(int i=0;i<n;i++)        scanf("%lf %lf",&a[i].x,&a[i].y);    double ans = inf;    for(int i=0;i<n;i++)    {        double area = fabs(x_mul(a[(i+1)%n],a[i],a[(i+2)%n]))/2.0;        double d = dis(a[i],a[(i+2)%n]);        ans = min(ans,area/d);    }    printf("%.6f\n",ans);    return 0;}
0 0