您的位置:首页 > 其它

2017 多校训练第六场 HDU 6097 Mindis

2017-08-10 23:40 483 查看
给出一个圆的半径,然后给出两个点P,Q的坐标,都不超出圆而且|OP|=|OQ|,问圆上一点到P和Q的距离之和最小是多少。

根据题解写了一份程序,请各位大佬参考

#include <bits/stdc++.h>
using namespace std;
// #define test TEST

int main(int argc, char const *argv[])
{
#ifdef test
freopen("test.txt","r",stdin);
#endif
int T;
scanf("%d",&T);
while(T--){
double r,a,b,c,d;
scanf("%lf %lf %lf %lf %lf",&r,&a,&b,&c,&d);
double rr=sqrt(a*a+b*b);
double k=r*r/(rr*rr);
double aa=k*a,bb=k*b,cc=k*c,dd=k*d;
double dislen=(aa*dd-bb*cc)/sqrt((cc-aa)*(cc-aa)+(dd-bb)*(dd-bb));
if(fabs(dislen)<=r){//反演点的连线与圆有交点
printf("%.7f\n",sqrt((a*r/rr-c*r/rr)*(a*r/rr-c*r/rr)+(b*r/rr-d*r/rr)*(b*r/rr-d*r/rr)));
// printf("%.7f\n",sqrt((aa-cc)*(aa-cc)+(bb-dd)*(bb-dd)));
continue;
}
//最优值在中垂线上取到
double diss=sqrt((a-c)*(a-c)+(b-d)*(b-d));
double t=r-sqrt(rr*rr-diss*diss/4);
double ans=sqrt(diss*diss/4+t*t)*2;
printf("%.7f\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: