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

本文介绍了一种计算凸多边形在保持其凸性的前提下各顶点可沿直线移动的最大距离的方法。通过计算每组相邻三点中中间点到两侧直线的垂直距离的一半并取所有组最小值来确定最终的最大位移。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

转载于:https://www.cnblogs.com/rtyfcvb/p/6722791.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值