HDU

来源:互联网 发布:vscode terminal 编辑:程序博客网 时间:2024/06/05 05:20

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6097

题目大意:给出圆内或圆上的两个点,这两个点到圆心的距离相等,一个点在圆上动,求他们的距离和最小

官方题解:
这里写图片描述

解体思路:就是根据官方题解的思路做的,如果不懂圆的反演的话可以看 http://blog.csdn.net/nightmare_ak/article/details/77073899 因为P点和Q点(题目中的称呼)是对称,所以很多东西都可以直接通过中垂线和相似求出,比如P’Q’可以通过PQ相似求出等,最后要注意的是,特判P,Q在圆心(0不能当除数)

AC代码:

#include<cstdio>#include<cmath>using namespace std;struct Pos{    double _x, _y;    Pos(double x=0,double y=0):_x(x),_y(y){}};int main(){    int t;scanf("%d", &t);    while (t--)    {        double r;        scanf("%lf", &r);        Pos p, q;        scanf("%lf%lf%lf%lf", &p._x, &p._y, &q._x, &q._y);        double Dpq = (p._x - q._x)*(p._x - q._x) + (p._y - q._y)*(p._y - q._y);        double Dop = p._x*p._x + p._y*p._y;        if (Dop < 1e-6)//特判两个点在圆心            printf("%.7f\n", 2 * r);        else if (r*r*(Dop - Dpq / 4) / (Dop*Dop) >= 1)            printf("%.7f\n", 2*sqrt(r*r-2*r*sqrt(Dop-Dpq/4)+Dop)+1e-8);//直接在中垂线上求PD+QD        else            printf("%.7f\n", r * sqrt(Dpq/Dop)+1e-8);//P'Q'之间的距离乘上系数    }    return 0;}