牛客寒假算法基礎集訓營5 A 炫酷雙截棍
阿新 • • 發佈:2019-02-02
namespace coder mod name 轉動 math msu urn 來源
現在小希把長為l1的木條的一端放在原點(0,0),任意轉動這兩根木條,小希想知道,是否有可能通過一種轉動方式使得雙截棍的另一端到達指定點呢?
如果不能,請輸出所有能到達的點中離目標點最近的距離。
鏈接:https://ac.nowcoder.com/acm/contest/331/A
來源:牛客網
現在小希把長為l1的木條的一端放在原點(0,0),任意轉動這兩根木條,小希想知道,是否有可能通過一種轉動方式使得雙截棍的另一端到達指定點呢?
如果不能,請輸出所有能到達的點中離目標點最近的距離。
輸入描述:
第一行輸入一個兩個正整數l1,l2,表示木條長度。
第二行輸入一個正整數T,表示詢問次數。
隨後T行,每行兩個實數xi,yi表示目標點的坐標。
l1,l2≤1000l1,l2≤1000
T≤1000T≤1000
|x|,|y|≤10000|x|,|y|≤10000
輸出描述:
對於每次詢問,如果可以到達,輸出0,如果無法到達,給出所有能到達的點中離目標點最近的距離。示例1
你的答案將被認為是正確的,如果相對誤差不大於1e-6。
輸入
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 炫酷雙截棍