2017多校六 1002题 hdu 6097 Mindis 相似三角形 计算几何

34 篇文章 0 订阅
4 篇文章 0 订阅

题目链接


题意:

圆心 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(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-8
void 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;
}


题解里面还说了...

优秀的黄金分割三分应该也是可以卡过的。

不优秀的三分哭晕在墙角(。

不过看出相似三角形什么的真是太妙了...服气

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值