HDU 6097---Mindis(二分)

题目链接

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

题意:有一个圆,圆心在原点,输入半径 r ,圆内有两个点P , Q 到圆心距离相同,现在求在圆上找一点M,使得PM+QM最小?

思路:

  

对于圆内的两个点 P 和 Q ,如果以其作为椭圆两个焦点,由图一可以看到:当椭圆顶点与圆相切时 , 圆与椭圆会有三个焦点,而椭圆上的点到P、Q的距离和是定值。那么可以缩小椭圆,接下来会有四个交点,继续缩小椭圆,得到图二,椭圆与圆只有两个交点,因为椭圆外的点到两个焦点的距离和大于2a,而椭圆上的点到两个焦点的距离和为2a,。在图2中,除了两个交点外,其余圆上点均在椭圆外,所以这时的交点到P、Q两点的距离和最小,等于2a。

如何找到这个相切的椭圆呢?二分解决。

具体:由P、Q两个焦点,我们可以确定c=PQ/2 ,  现在如果再给出一个b值那么就能确定这个椭圆了,而b值越大椭圆越大,b值越小椭圆越小,所以我们要找到如图2所示,相切只有两个焦点时的b值,那么我们需要找的就是圆和椭圆相交时最小的b。我们可以求出图3中所示的 h 和 R -h ,那么椭圆的方程为:x^2/a^2 + (y-h)^2/b^2 = 1 ( 这个方程是PQ平行于X轴时的,但PQ不平行于X时也不影响,我们只是用它判断是否与圆相交 ) 圆:x^2 + y^2 =R^R ,    并且b>0(显然),b<R-h ,所以在(0,R-h) 二分查找b。

代码如下:

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
const double eps = 1e-10;
double dis(double x1,double y1,double x2,double y2 )
{
    return sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));
}
namespace IO {
    const int MX = 4e7; //1e7占用内存11000kb
    char buf[MX]; int c, sz;
    void begin() {
        c = 0;
        sz = fread(buf, 1, MX, stdin);
    }
    inline bool read(int &t) {
        while(c < sz && buf[c] != ‘-‘ && (buf[c] < ‘0‘ || buf[c] > ‘9‘)) c++;
        if(c >= sz) return false;
        bool flag = 0; if(buf[c] == ‘-‘) flag = 1, c++;
        for(t = 0; c < sz && ‘0‘ <= buf[c] && buf[c] <= ‘9‘; c++) t = t * 10 + buf[c] - ‘0‘;
        if(flag) t = -t;
        return true;
    }
}

int main()
{
    IO::begin();
    int T;
    double R,x1,x2,y1,y2;
    double x3,y3;
    double A,B,C,dt,ans1,ans2;
    //cin>>T;
    IO::read(T);
    while(T--)
    {
        //scanf("%lf%lf%lf%lf%lf",&R,&x1,&y1,&x2,&y2);
        int xr, xx1, xx2, yy1, yy2;
        IO::read(xr);
        IO::read(xx1);
        IO::read(yy1);
        IO::read(xx2);
        IO::read(yy2);
        R = xr;
        x1 = xx1;y1 = yy1;x2 = xx2;y2 = yy2;
        double c=dis(x1,y1,x2,y2)*0.5;
        c=c*c;
        x3=(x1+x2)*0.5;
        y3=(y1+y2)*0.5;
        double h=dis(x3,y3,0.0,0.0);
        //cout<<h<<endl;
        double Rb=R-h;
        double Lb=0.0,b,a,mid;

        for(int i=0; i<30; i++)
        {
            mid=(Lb+Rb)*0.5;
            b = mid;
            b=b*b;
            a=c+b;
            A=a-b;
            B=2.0*a*h;
            C=b*R*R+a*h*h-a*b;
            dt=B*B-4.0*A*C;
            int flag=1;
            if(dt>=-eps)
            {
                ans1=(-B+sqrt(B*B-4.0*A*C))*0.5/A;
                ans2=(-B-sqrt(B*B-4.0*A*C))*0.5/A;
                ans1=ans1*ans1;
                ans2=ans2*ans2;
                if(R*R-ans1>=-eps||R*R-ans2>=-eps)
                    flag=0;
            }
            if(flag==0)
                Rb=mid;
            else
                Lb=mid;
        }
        printf("%.10f\n",sqrt(a)*2.0);

    }
    return 0;
}
时间: 2024-10-04 20:29:34

HDU 6097---Mindis(二分)的相关文章

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

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(数学几何,圆心的反演点)

Mindis Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 2787    Accepted Submission(s): 555Special Judge Problem Description The center coordinate of the circle C is O, the coordinate of O is (0,

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 1045 二分匹配

题目链接 Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 6282    Accepted Submission(s): 3551 Problem Description Suppose that we have a square city with straight streets. A map of a city i

hdu 3641 数论 二分求符合条件的最小值数学杂题

http://acm.hdu.edu.cn/showproblem.php?pid=3641 学到: 1.二分求符合条件的最小值 /*==================================================== 二分查找符合条件的最小值 ======================================================*/ ll solve() { __int64 low = 0, high = INF, mid ; while(low <=

HDU 4768 Flyer (二分)

OJ题目:click here~~ 题目分析:n个[a  b] 区间,对于i 属于[a  b]  ,从a开始,间隔c ,即i = a , i = a + c , i = a + 2*c -- 将x[ i ] 加1 ,x[ i ] 初值为0 . 已知最多只有一个x[ i ] 为奇数.找到这个i , 和这个奇数. 由于最多只有一个奇数,且奇数 + 偶数 = 奇数.用二分夹逼出这个奇数的位置.找到这个位置,再计算这个奇数就很容易了. AC_CODE const int maxn = 20002; LL

hdu 4400 离散化+二分+BFS(暴搜剪枝还超时的时候可以借鉴一下)

Mines Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1110    Accepted Submission(s): 280 Problem Description Terrorists put some mines in a crowded square recently. The police evacuate all peo

hdu 2962 Trucking (二分+最短路Spfa)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1763    Accepted Submission(s): 618 Problem Description A certain local trucking co

HDU 2295 DLX 二分

Radar Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2229    Accepted Submission(s): 888 Problem Description N cities of the Java Kingdom need to be covered by radars for being in a state of w