本文主要是介绍【洛谷】P3744 - 李彬的几何(计算几何题),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接
题意:求将一个凸多边形移动成非凸多边形的最短距离。
思路:只要有一个角是平角那就不是凸多边形啦。所以就是找到将某一个角变成平角的最短距离。
图示:
其中x为所求距离,直线代表移动后的平角。
利用海伦公式
s=p (p−a)(p−b)(p−c)−−−−−−−−−−−−−−−−−−√ , 其中 a ,b ,c ,p 分别为三角形三边长和周长。 s = p ( p − a ) ( p − b ) ( p − c ) , 其 中 a , b , c , p 分 别 为 三 角 形 三 边 长 和 周 长 。
可求出x。
公式:
x=s2b,b 为边 AC 的长 x = s 2 b , b 为 边 A C 的 长
AC代码:
#include <bits/stdc++.h>
using namespace std;
struct Point{double x,y;Point(){}Point(double xx,double yy){x = xx;y = yy;}
}p[1100];
double dist(Point a, Point b){return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
int main(int argc, char const *argv[])
{int n;scanf("%d",&n);for(int i=0;i<n;++i) scanf("%lf %lf",&p[i].x,&p[i].y);double a,b,c,s,e,h,mmin = 0x3f3f3f3f3f3f3f3f;for(int i=0;i<n;++i){a = dist(p[(i+1)%n],p[(i+2)%n]);b = dist(p[i],p[(i+2)%n]);c = dist(p[i],p[(i+1)%n]);e = 0.5*(a+b+c);s = sqrt(e*(e-a)*(e-b)*(e-c));h = s/b;mmin = min(mmin,h);}printf("%.10lf\n", mmin);return 0;
}
这篇关于【洛谷】P3744 - 李彬的几何(计算几何题)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!