1. 程式人生 > >牛客寒假算法基礎集訓營5 A 炫酷雙截棍

牛客寒假算法基礎集訓營5 A 炫酷雙截棍

namespace coder mod name 轉動 math msu urn 來源

鏈接:https://ac.nowcoder.com/acm/contest/331/A
來源:牛客網

小希現在手裏有一個連著的兩塊木條,長度分別為l1,l2,木條之間有一個無摩擦的連接點,木條之間可以相互轉動,小希將其稱之為雙截棍。

現在小希把長為l1的木條的一端放在原點(0,0),任意轉動這兩根木條,小希想知道,是否有可能通過一種轉動方式使得雙截棍的另一端到達指定點呢?

如果不能,請輸出所有能到達的點中離目標點最近的距離。 技術分享圖片

輸入描述:

第一行輸入一個兩個正整數l1,l2,表示木條長度。

第二行輸入一個正整數T,表示詢問次數。

隨後T行,每行兩個實數xi,yi表示目標點的坐標。

l1,l21000l1,l2≤1000

T1000T≤1000

|x|,|y|10000|x|,|y|≤10000

輸出描述:

對於每次詢問,如果可以到達,輸出0,如果無法到達,給出所有能到達的點中離目標點最近的距離。

你的答案將被認為是正確的,如果相對誤差不大於1e-6。
示例1

輸入

23 13
3
15 1
40 0
0 0

輸出

0.00000000
4.00000000
10.00000000

思路:已知起點為原點,終點坐標也在測試樣例中給出,可以算出兩點之間的距離;就知道了三邊的距離;
如果這三邊可以構成三角形,就輸出0;若不能,輸出還差多少就可以構成三角形;

代碼如下:
#include<bits/stdc++.h>
using namespace std;
#define ll long long

int main()
{
    double a,b,c,x,y,re;
    int n;
    cin >> a >> b >> n;
    while(n--)
    {
        cin >> x >> y;
        c = sqrt(x * x + y * y);
        double aa[3] = {a,b,c};
        sort(aa,aa + 3);
        if(aa[0] + aa[1] >= aa[2])
        {
            re = 0;
            printf("%.08f\n",re);
        }

        else
        printf("%.08f\n",aa[2] - aa[1] - aa[0]);
    }
	return 0;
}

  

牛客寒假算法基礎集訓營5 A 炫酷雙截棍