HDU 6097---Mindis(二分)

来源:http://www.cnblogs.com/chen9510/archive/2017/08/10/7341215.html
-Advertisement-
Play Games

題目鏈接 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 out ...


題目鏈接

 

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
T500000
100x,y100
1r100
 

 

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 106.
Formally, let your answer be a, and the jury's answer be b. Your answer is considered correct if |ab|max(1,b)106.
 

 

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;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這裡繼續dubbo的源碼旅程,在過程中學習它的設計和技巧,看優秀的代碼,我想對我們日程編碼必然有幫助的。而那些開源的代碼正是千錘百煉的東西,希望和各位共勉。 拿ProtocolListenerWrapper為例子,看源碼的時候發現它是一個裝飾類的標準實現有一個自身的複製構造函數,把被包裝者複製進來, ...
  • 3.python函數與模塊 python的函數定義: 以def關鍵字定義一個函數; 參數放在小括弧裡面; 必須有return語句; 關鍵字參數: 即調用函數時傳參順序可以人為指定 預設參數: 預設參數必須放在非預設參數的後面 可變參數: 帶*的參數為可變參數,表示所有未命名參數元組 ...
  • 題目描述 對於一個五位數a1a2a3a4a5,可將其拆分為三個子數: sub1=a1a2a3 sub2=a2a3a4 sub3=a3a4a5 例如,五位數20207可以拆分成 sub1=202 sub2=020(=20) sub3=207 現在給定一個正整數K,要求你編程求出10000到30000之 ...
  • 題目背景 第二次世界大戰時期.. 題目描述 英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可以與其他若幹名英國飛行員很好地配合。如何選擇配對飛行 ...
  • I'm changing the background color based on the data but it makes my text hard to read so I need to change the font color (to white if I have a darker ...
  • 案例1: 演示FileInputStream類的使用(用FileInputStream的對象把文件讀入到記憶體) 首先要在E盤新建一個文本文件,命名為test.txt,輸入若幹字元 運行程式,控制台輸出test.txt中輸入的字元。 案例2: 演示FileOutputStream的使用(把輸入的字元串 ...
  • 題目描述 經過千辛萬苦小 A 得到了一塊切糕,切糕的形狀是長方體,小 A 打算攔腰將切糕切成兩半分給小 B。出於美觀考慮,小 A 希望切麵能儘量光滑且和諧。於是她找到你,希望你能幫她找出最好的切割方案。 出於簡便考慮,我們將切糕視作一個長 P、寬 Q、高 R 的長方體點陣。我們將位於第 z層中第 x ...
  • 在JVM中類載入過程中,在解析階段,Java虛擬機會把類的二級制數據中的符號引用替換為直接引用。 1.符號引用(Symbolic References): 符號引用以一組符號來描述所引用的目標,符號可以是任何形式的字面量,只要使用時能夠無歧義的定位到目標即可。例如,在Class文件中它以CONSTA ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...