• 第六场 hdu 6097 Mindis (几何)


    http://acm.hdu.edu.cn/showproblem.php?pid=6097

    题目大意:有个圆,圆内有两个点P,Q,已知PO=QO,求圆上一点D,使得PD+QD最小

    解题思路:官方题解

    找着题解一步步想的,代码中有详细的解释

    AC代码:

     1 #include <iostream>
     2 #include <bits/stdc++.h>
     3 using namespace std;
     4 const double eps=1e-8;
     5 void work()
     6 {
     7     double r,x1,x2,y1,y2;
     8     scanf("%lf%lf%lf%lf%lf",&r,&x1,&y1,&x2,&y2);
     9     double d0=sqrt(pow(x1,2)+pow(y1,2));
    10     if(fabs(d0)<eps)
    11     {
    12         printf("%.9lf
    ",2*r);
    13         return ;
    14     }
    15     double k=r*r/(d0*d0);//点P'相对于点P的比值
    16     double x3=x1*k,x4=x2*k,y3=y1*k,y4=y2*k,ans;//求出来点P'和Q'
    17     double mx=(x3+x4)/2,my=(y3+y4)/2;//求出点P'和Q'之间的中间点
    18     double d=sqrt(pow(mx,2)+pow(my,2));//求出中间点到原点之间的距离
    19     if(d<=r)
    20     {
    21         double dist=sqrt(pow(x3-x4,2)+pow(y3-y4,2));//P'和Q'之间的距离
    22         ans=dist*d0/r;//相似三角形求和
    23     }
    24     else
    25     {
    26         double kk=r/d;
    27         double smx=mx*kk,smy=my*kk;//得到点D的x和y
    28         ans=2*sqrt(pow(smx-x1,2)+pow(smy-y1,2));
    29     }
    30     printf("%.9lf
    ",ans);
    31 }
    32 int main()
    33 {
    34     int T;
    35     scanf("%d",&T);
    36     while(T--) work();
    37     return 0;
    38 }

     

  • 相关阅读:
    384. 最长无重复字符的子串
    406. 和大于S的最小子数组
    159. 寻找旋转排序数组中的最小值
    62. 搜索旋转排序数组
    20. 骰子求和
    125. 背包问题 II
    92. 背包问题
    1295. 质因数统计
    471. 最高频的K个单词
    1339. 最大区间
  • 原文地址:https://www.cnblogs.com/wang-ya-wei/p/7348099.html
Copyright © 2020-2023  润新知