hdu 6097 Mindis(数学几何,圆心的反演点)

Mindis

Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2787    Accepted Submission(s): 555
Special Judge

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

Source

2017 Multi-University Training Contest - Team 6

Recommend

liuyiding   |   We have carefully selected several similar problems for you:  6119 6118 6117 6116 6115

以下转自:http://blog.csdn.net/kkkkahlua/article/details/77074409

题意:

圆心 O 坐标(0, 0), 给定两点 P, Q(不在圆外),满足 PO = QO,

要在圆上找一点 D,使得 PD + QD 取到最小值。

官方题解:

做P点关于圆的反演点P‘,OPD与ODP‘相似,相似比是|OP| : r。

Q点同理。

极小化PD+QD可以转化为极小化P‘D+Q‘D。

当P‘Q‘与圆有交点时,答案为两点距离,否则最优值在中垂线上取到。

时间复杂度 O(1)O(1)

补充说明:

反演:

设在平面内给定一点O和常数k(k不等于零),对于平面内任意一点A,确定A′,使A′在直线OA上一点,并且有向线段OA与OA′满足OA·OA′=k,我们称这种变换是以O为的反演中心,以k为反演幂的反演变换,简称反演。——百度百科

在这里,k 即为圆半径 r ^ 2,因此,相似就是显然的了。

当 P‘Q‘ 与圆有交点时:

不妨设交点为 O‘,若 D 不为 O‘,则 P‘D + Q‘D >  P‘Q‘(三角形两边之和大于第三边);当且仅当 D 取 O‘ 时,P‘Q + Q‘D 取到最小值,即为 P‘Q‘。

当 P‘Q‘ 与圆无交点时:

不妨将 P‘ 与 Q‘ 看成椭圆的两个焦点,当椭圆慢慢变大时,第一个碰到的圆上的点 D 即为使得 P‘D + Q‘D 最小的点;画个图就很显然了,第一个碰到的点即为 PQ 的中垂线与圆的交点。

至于判断有 P‘Q‘ 与圆有没有交点,就是圆心到直线的距离与半径比较,又因为此处 P‘O=Q‘O,所以只需要比较 P‘Q‘ 的中点到圆心的距离和半径的大小。

注意点:

1. 注意 PO = QO = 0 的情况

2. 尽量用比例而不是角度进行计算

这题精度很是问题

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

const double eps=1e-8;
int t;
double R,px,py,qx,qy;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf%lf%lf%lf%lf",&R,&px,&py,&qx,&qy);
        if (px==0 && py==0) {printf("%.7lf\n",2*R);continue;}
        double r=sqrt(pow(px,2)+pow(py,2));
        double k=R*R/(r*r);  //不是相似比
        double ppx=px*k,ppy=py*k,qqx=qx*k,qqy=qy*k;
        //printf("%.2lf %.2lf\n",ppx,ppy);
        double midx=(ppx+qqx)/2,midy=(ppy+qqy)/2;
        double dis=sqrt(pow(midx,2)+pow(midy,2) );
        //printf("%.7lf\n",dis);
        if (dis<=R)
        {
           // double op2=sqrt(pow(ppx,2)+pow(ppy,2));
            printf("%.7lf\n",sqrt(pow(ppx-qqx,2)+pow(ppy-qqy,2))*r/R);

        } else
        {
            double mx=midx/dis*R; double my=midy/dis*R;
            printf("%.7lf\n",2*sqrt(pow(mx-px,2)+pow(my-py,2)) );
        }
    }
    return 0;
}
时间: 2025-01-07 14:43:33

hdu 6097 Mindis(数学几何,圆心的反演点)的相关文章

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6097 题意:有一个圆心在原点的圆,给定圆的半径,给定P.Q两点坐标(PO=QO,P.Q不在圆外),取圆上一点D,求PD+QD的最小值. 解法:圆的反演. 很不幸不总是中垂线上的点取到最小值,考虑点在圆上的极端情况. 做P点关于圆的反演点P',OPD与ODP'相似,相似比是|OP| : r. Q点同理. 极小化PD+QD可以转化为极小化P'D+Q'D. 当P'Q'与圆有交点时,答案为两点距离,否则最优

第六场 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

HDU 6097 Mindis (计算几何)

题意:给一个圆C和圆心O,P.Q是圆上或圆内到圆心距离相等的两个点,在圆上取一点D,求|PD| + |QD|的最小值 析:首先这个题是可以用三分过的,不过也太,.... 官方题解: 很不幸不总是中垂线上的点取到最小值,考虑点在圆上的极端情况. 做P点关于圆的反演点P',OPD与ODP'相似,相似比是|OP| : r. Q点同理. 极小化PD+QD可以转化为极小化P'D+Q'D. 当P'Q'与圆有交点时,答案为两点距离,否则最优值在中垂线上取到. 时间复杂度 O(1)O(1) 也有代数做法,结论相

hdu 1577 WisKey的眼神 (数学几何)

WisKey的眼神 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2059    Accepted Submission(s): 625 Problem Description WisKey的眼镜有500多度,所以眼神不大好,而且他有个习惯,就是走路喜欢看着地(不是为了拣钱哦^_^),所以大家下次碰见他的时候最好主动打下招呼,呵呵.但是

hdu 1115 Lifting the Stone (数学几何)

Lifting the Stone Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 5203    Accepted Submission(s): 2155 Problem Description There are many secret openings in the floor which are covered by a big

HDU 4793 Collision + HDU 4798 Skycity 简单几何

HDU 4793 链接:http://acm.hdu.edu.cn/showproblem.php?pid=4793 题意:给一个以(0,0)为圆心半径为R的圆形区域,中间放着一个(0,0)为圆心半径为Rm的圆盘,在坐标(x,y)处(严格在圆形区域外)放着一枚半径为r的硬币,运动方向和速度为(vx,vy),在运动中碰到圆盘时,会按碰撞问题反弹(圆盘是固定不动的),问硬币会在圆形区域里呆多长时间(硬币只要有一点点在圆形区域里就记为硬币在圆形区域内). 思路:首先先计算出硬币在移动过程中如果不与圆盘

hdu 4811 Ball(数学)

题目链接:hdu 4811 Ball 题目大意:有三种颜色的球若干,每次向桌子上放一个球,保证是一条序列,每次放球的得分为当前放入序列的球的前面有多少种不同的颜色a,后面的有多少种不同的颜色b,a+b.问说给定球的数量后,最大得分为多少. 解题思路:因为放球顺序是自己定的,所以我们可以尽量早得构造一个序列,使得后面放入球的得分均保持在峰值.那么求峰值就要根据球的数量来决定.我们叫得分为峰值的求为最高得分球,它们有很多个.对于一种颜色来说:0个,表示不能为在最高得分球的左边和右边,换句话来说,就是

E - GuGuFishtion HDU - 6390(欧拉函数 / 莫比乌斯反演)

GuGuFishtion (HDU - 6390) 题意: 定义\(G_u (a,b)=\frac{\phi(ab)}{\phi(a)\phi(b)}\). 求\((\sum\limits_{a=1}^m\sum\limits_{b=1}^nG_u (a,b))\pmod p\). 题解: 考虑\(\phi(x) = x*(1-\frac{1}{p_1})*(1-\frac{1}{p_2})...*(1-\frac{1}{p_n})\). 将\(G_u (a,b)\)的分子与分母按上述分解.约分

hdu 1719 Friend 数学推导

题链:http://acm.hdu.edu.cn/showproblem.php?pid=1719 Friend Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2099    Accepted Submission(s): 1058 Problem Description Friend number are defined recur