第六场 hdu 6097 Mindis (几何)

Posted Wally的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六场 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\\n",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\\n",ans);
31 }
32 int main()
33 {
34     int T;
35     scanf("%d",&T);
36     while(T--) work();
37     return 0;
38 }

 

 

 

以上是关于第六场 hdu 6097 Mindis (几何)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 6097 Mindis (计算几何)

2017多校第6场 HDU 6097 Mindis 计算几何,圆的反演

HDU 6097---Mindis(二分)

杭电2018多校第六场(2018 Multi-University Training Contest 6) 1012.Pinball(HDU 6373) -简单的计算几何+物理受力分析

杭电2018多校第六场(2018 Multi-University Training Contest 6) 1001.oval-and-rectangle (HDU6362)-数学期望微积分(示例代(

hdu多校第六场1008 (hdu6641)TDL 暴力