codeforces 801D Volatile Kite

本文解析了CodeForces上的一道题目,该题要求计算多边形顶点的最大移动距离,以保持其多边形特性不变。通过计算每个顶点到相邻顶点连线的垂直距离的一半来得到答案。

题目链接:http://codeforces.com/contest/801/problem/D

题意:给你一个多边形的n个点,点顺时针给出,每个点坐标xi,yi,然后让你求每个点做多移动距离dis,使他还能保持多边形。

分析:当时也不清楚凸包什么的,看了样例,发现和每个点到相邻点构成的直线的距离有关,计算之后发现是一半,然后样例太坑,我计算点到直线的距离算错了,强行求了一波中位线,然后样例是等腰的还过了,记下来,点到直线的距离具体看代码。

AC代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct st{
 4     double x, y;
 5 }a[1005];
 6 double dis(double x1,double y1,double x2,double y2,double x,double y){
 7     if(x1!=x2){
 8         double k=(y2-y1)/(x2-x1);
 9         return fabs((y-y1)-k*(x-x1))/sqrt(1+k*k);
10     }
11     else return fabs(x-x1);
12 }
13 int main() {
14     int n;
15     cin>>n;
16     for(int i=0;i<n;i++){
17         cin>>a[i].x>>a[i].y;
18     }
19     double result=1e18;
20     for(int i=0;i<n;i++){
21         double s=dis(a[(i-1+n)%n].x,a[(i-1+n)%n].y,a[(i+1)%n].x,a[(i+1)%n].y,a[i].x,a[i].y)*0.5;
22         result=min(result,s);
23     }
24     printf("%.8lf\n",result);
25     return 0;
26 }
View Code

 

转载于:https://www.cnblogs.com/ls961006/p/6921435.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值