第六场 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 (几何)的主要内容,如果未能解决你的问题,请参考以下文章
2017多校第6场 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)-数学期望微积分(示例代(