2017多校六 1002题 hdu 6097 Mindis 相似三角形 计算几何
来源:互联网 发布:网站发布到域名 编辑:程序博客网 时间:2024/06/05 06:29
题目链接
题意:
圆心 O 坐标(0, 0), 给定两点 P, Q(不在圆外),满足 PO = QO,
要在圆上找一点 D,使得 PD + QD 取到最小值。
官方题解:
做P点关于圆的反演点P',OPD与ODP'相似,相似比是|OP| : r。
Q点同理。
极小化PD+QD可以转化为极小化P'D+Q'D。
当P'Q'与圆有交点时,答案为两点距离,否则最优值在中垂线上取到。
时间复杂度 O(1)
补充说明:
反演:
设在平面内给定一点O和常数k(k不等于零),对于平面内任意一点A,确定A′,使A′在直线OA上一点,并且有向线段OA与OA′满足OA·OA′=k,我们称这种变换是以O为的反演中心,以k为反演幂的反演变换,简称反演。——百度百科
在这里,k 即为圆半径 r ^ 2,因此,相似就是显然的了。
当 P'Q' 与圆有交点时:
不妨设交点为 O',若 D 不为 O',则 P'D + Q'D > P'Q'(三角形两边之和大于第三边);当且仅当 D 取 O' 时,P'Q + Q'D 取到最小值,即为 P'Q'。
当 P'Q' 与圆无交点时:
不妨将 P' 与 Q' 看成椭圆的两个焦点,当椭圆慢慢变大时,第一个碰到的圆上的点 D 即为使得 P'D + Q'D 最小的点;画个图就很显然了,第一个碰到的点即为 PQ 的中垂线与圆的交点。
至于判断有 P'Q' 与圆有没有交点,就是圆心到直线的距离与半径比较,又因为此处 P'O=Q'O,所以只需要比较 P'Q' 的中点到圆心的距离和半径的大小。
注意点:
1. 注意 PO = QO = 0 的情况
2. 尽量用比例而不是角度进行计算
Code:
#include <bits/stdc++.h>#define eps 1e-8void work() { double r, x1, y1, x2, y2; scanf("%lf%lf%lf%lf%lf", &r, &x1, &y1, &x2, &y2); double d0 = sqrt(pow(x1, 2) + pow(y1, 2)); if (fabs(d0) < eps) { printf("%.7f\n", 2 * r); return; } double k = r * r / (d0 * d0); double x3 = x1 * k, x4 = x2 * k, y3 = y1 * k, y4 = y2 * k; double mx = (x3+x4)/2, my = (y3+y4)/2, ans; double d = sqrt(pow(mx,2)+pow(my,2)); if (d <= r) { double dist = sqrt(pow(x3 - x4, 2) + pow(y3 - y4, 2)); ans = dist * d0 / r; } else { double kk = r / d; double smx = mx * kk, smy = my * kk; ans = 2 *sqrt(pow(smx - x1, 2) + pow(smy - y1, 2)); } printf("%.7f\n", ans);}int main() { int T; scanf("%d", &T); while (T--) work(); return 0;}
题解里面还说了...
优秀的黄金分割三分应该也是可以卡过的。
不优秀的三分哭晕在墙角(。
不过看出相似三角形什么的真是太妙了...服气
- 2017多校六 1002题 hdu 6097 Mindis 相似三角形 计算几何
- (2017多校6)1002/hdu-6097 Mindis(计算几何)
- HDU 6097 Mindis【计算几何】
- HDU 6097 Mindis(计算几何)
- HDU 6097 Mindis【计算几何+反演点】
- HDU 6097 Mindis(计算几何)
- HDU 2017 多校联合训练赛6 1002 6097 Mindis 反演变换 计算几何
- HDU 4082(计算几何+相似三角形)
- hdu 4082 计算几何 相似三角形
- hdu 6097 Mindis(几何)
- HDU 6097 Mindis【几何】
- HDU 6097 Mindis 几何
- HDU 6097 Mindis(几何)
- hdu 6097 Mindis(几何反演)
- 多校6 HDU-6097 Mindis 几何数学
- hdu6097—Mindis(计算几何)
- hud 6097 Mindis(几何)
- hdu 4709 - Herding【计算几何-三角形面积】
- bayes python 机器学习实战
- Python函数(function)与方法(method)区别
- redis-cluster安装部署记录
- HTML5中表单验证的8种方法
- 安装CherryTree,报错无法找到 gtksourceview2
- 2017多校六 1002题 hdu 6097 Mindis 相似三角形 计算几何
- 【Codeforces 608B】Hamming Distance Sum(前缀和)
- 2.Android灯光系统_编写HAL_lights.c
- java异常简介及架构
- SpringBoot_restful
- 数据库基础知识
- VideoView视频大小屏切换/缓冲/卡顿监听和处理
- 回文寻找
- 基于docker的codis3部署