题目链接

Problem Description

The center coordinate of the circle C is O, the coordinate of O is (0,0) , and the radius is r.

P and Q are two points not outside the circle, and PO = QO.

You need to find a point D on the circle, which makes PD+QD minimum.

Output minimum distance sum.

Input

The first line of the input gives the number of test cases T; T test cases follow.

Each case begins with one line with r : the radius of the circle C.

Next two line each line contains two integers x , y denotes the coordinate of P and Q.

Limits

T≤500000

−100≤x,y≤100

1≤r≤100

Output

For each case output one line denotes the answer.

The answer will be checked correct if its absolute or relative error doesn't exceed 10−6.

Formally, let your answer be a, and the jury's answer be b. Your answer is considered correct if |a−b|max(1,b)≤10−6.

Sample Input

4

4

4 0

0 4

4

0 3

3 0

4

0 2

2 0

4

0 1

1 0

Sample Output

5.6568543

5.6568543

5.8945030

6.7359174

题意:

给定一个圆心在坐标原点的圆以及该圆的半径,然后给出两个到该圆的圆心等长的非圆外点(点既可以在圆内,也可以在圆上),让从圆上找一点使其到两点的距离最短。

分析:

首先我们考虑两种最特殊的情况:

1.两个点共位置,这种情况也是完全满足题上给出的条件的,这样的话最短距离就是圆半径减去圆心到改点的距离,因为要看做两个点所以还得乘以2.

2.两个点在圆上,这样的话最短距离就是两点之间的距离。

考虑完这两种特殊的情况之后我么看一下一般的情况。

首先介绍一下反演点的定义:

如果圆内有一点P,过圆心做一条与P的连线,将这条线延长,使得在圆外的这条线上有一点P',与P关于该圆对称。

我们即可得出结论OP×OP'=r×r(r为该圆的半径)

然后我们就可以将求DP+DQ转换为求DP' +DQ',

现在的问题在于何种情况下这个点都是在中垂线上的这个点吗?

答案当然不是,我们通过连接两个反演点就可以发现,两个反演点的连线有可能与圆相交,相切的时候可以很简单的确定切点即为所求的点,相离也是如此,问题是相交的时候这个点应该如何确定呢?

相交的时候P、Q、P'、Q'可以构成一个等腰梯形,梯形与圆有一条腰的平分线,这条平分线就是我们要找的最短的距离,当然梯形与圆的交点不是我们要找的点,我们只是通过等量的转换将它转换过来而已。

后面在求DP'的长度的时候,应用到一些有关椭圆的知识,P’Q'就是椭圆的长轴,D到椭圆中心的连线即为短半轴,这样的话DP’即为c,可以简单的求得,最终求出答案。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
using namespace std;
const double esp=0.000000005;
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
double r,x[2],y[2];
scanf("%lf%lf%lf%lf%lf",&r,&x[0],&y[0],&x[1],&y[1]);
double op=dis(0.0,0.0,x[0],y[0]);
if(x[0]==x[1]&&y[0]==y[1])
{
printf("%.7lf\n",2.0*(r-op));
continue;
}
if(op==r)
{
printf("%.7lf\n",dis(x[0],y[0],x[1],y[1]));
continue;
}
double o=acos((x[0]*x[1]+y[0]*y[1])/op/op)/2.0;///op与od的夹角
double d=r*r/op;///d表示的是圆心到反演点的距离
double h=d*cos(o);/// 两反演点构成的直线的距离
if(h<=r)
{
printf("%.7lf\n",2.0*r*sin(o));
continue;
}
double b=h-r,a=d*sin(o);
printf("%.7lf\n",op*sqrt(a*a+b*b)*2.0/r);
}
return 0;
}

2017ACM暑期多校联合训练 - Team 6 1002 HDU 6097 Mindis (数学)的更多相关文章

  1. 2017ACM暑期多校联合训练 - Team 8 1002 HDU 6134 Battlestation Operational (数论 莫比乌斯反演)

    题目链接 Problem Description The Death Star, known officially as the DS-1 Orbital Battle Station, also k ...

  2. 2017ACM暑期多校联合训练 - Team 7 1002 HDU 6121 Build a tree (深搜+思维)

    题目链接 Problem Description HazelFan wants to build a rooted tree. The tree has n nodes labeled 0 to n− ...

  3. 2017ACM暑期多校联合训练 - Team 1 1002 HDU 6034 Balala Power! (字符串处理)

    题目链接 Problem Description Talented Mr.Tang has n strings consisting of only lower case characters. He ...

  4. 2017ACM暑期多校联合训练 - Team 4 1004 HDU 6070 Dirt Ratio (线段树)

    题目链接 Problem Description In ACM/ICPC contest, the ''Dirt Ratio'' of a team is calculated in the foll ...

  5. 2017ACM暑期多校联合训练 - Team 9 1005 HDU 6165 FFF at Valentine (dfs)

    题目链接 Problem Description At Valentine's eve, Shylock and Lucar were enjoying their time as any other ...

  6. 2017ACM暑期多校联合训练 - Team 9 1010 HDU 6170 Two strings (dp)

    题目链接 Problem Description Giving two strings and you should judge if they are matched. The first stri ...

  7. 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)

    题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...

  8. 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)

    题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...

  9. 2017ACM暑期多校联合训练 - Team 8 1008 HDU 6140 Hybrid Crystals (模拟)

    题目链接 Problem Description Kyber crystals, also called the living crystal or simply the kyber, and kno ...

随机推荐

  1. 关于“问吧APP”问卷调查报告分析与体会

         上周根据我们走廊奔跑队的“问吧APP”项目对本校范围内的学生发放了上百份调查问卷,并对此作出了统计和整理.针对我们项目所提出的问题涉及到的用户信息有性别.年龄.学历.职业.平时上网途径以及对 ...

  2. Maven编译打包出错:找不到符号

    项目中,使用的是maven管理,但是有几个jar不是通过maven引入的,是通过IDEA导入的,在使用maven插件编译的时候,会出现如下的一些错误: 解决方法: 在项目中创建一个目录lib,然后将j ...

  3. 第111天:Ajax之jQuery实现方法

    由于jQuery中的Ajax方法是用了内置的deferred模块,是Promise模式的一种实现,而我们这里没有讲过,所以我们就不使用这一模式啦. 我们只定义一个Ajax方法,他可以简单的get,po ...

  4. VBA-从周课表统计节次

    Sub datainsert() Dim r1 As Integer, r2 As Integer, i As Integer, j As Integer, findrow As Integer, f ...

  5. BZOJ 1444 有趣的游戏(AC自动机+矩阵快速幂)

    真的是很有趣的游戏... 对每个单词构建好AC自动机后,由于单词都是相同长度的且不同,所以不会出现互相为子串的形式. 那么我们对AC自动机上的节点构建转移矩阵.对于每个单词末尾的节点.该节点的出边仅仅 ...

  6. http://www.pythonchallenge.com/ 网站题解

    在知乎中无意发现了这个网站,做了几题发现挺有趣的,这里记录下自己的解题思路,顺便对比下答案中的思路 网页:http://www.pythonchallenge.com/ 目前只做了几题,解题的方法就是 ...

  7. JAVA中的堆、栈等内存分析

    在 JAVA 中,有六个不同的地方可以存储数据 1. 寄存器( register ) 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  8. Eclipse如何将代码变成大写/小写

    代码变小写:选中要换的代码,操作Ctrl+Shift+y即可将大写变小写 代码变大写:选中要换的代码,操作Ctrl+Shift+x即可将小写变大写

  9. JDBC连接Oracle

    数据库的操作是当前系统开发必不可少的开发部分之一,尤其是在现在的大数据时代,数据库尤为重要.但是你真的懂得Java与数据库是怎么连接的么? 先给大家一个数据库连接的简单实例: package com. ...

  10. 【BZOJ2151】种树(贪心)

    [BZOJ2151]种树(贪心) 题面 BZOJ 题解 如果没有相邻不能选的限制,那么这就是一道傻逼题. 只需要用一个堆维护一下就好了. 现在加上了相邻点的限制,那么我们就对于当前位置加入一个撤销操作 ...