炫酷双截棍 (基础几何)
链接:https://ac.nowcoder.com/acm/contest/331/A
来源:牛客网
题目描述
小希现在手里有一个连着的两块木条,长度分别为l1l1,l2l2,木条之间有一个无摩擦的连接点,木条之间可以相互转动,小希将其称之为双截棍。
现在小希把长为l1l1的木条的一端放在原点(0,0),任意转动这两根木条,小希想知道,是否有可能通过一种转动方式使得双截棍的另一端到达指定点呢?
如果不能,请输出所有能到达的点中离目标点最近的距离。
输入描述:
第一行输入一个两个正整数l1l1,l2l2,表示木条长度。 第二行输入一个正整数T,表示询问次数。 随后T行,每行两个实数xixi,yiyi表示目标点的坐标。 l1,l2≤1000l1,l2≤1000 T≤1000T≤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
计算两根棍子的和 与 差,如果给定的坐标长度在【差,和】的范围之中,则一定能有方法到达,反之,就输出离“和”或者“差”中最近的距离。
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n,m,j,k,i,T;
double a,b ,c,sum,ans,x,y;
cin>>a>>b;
double Max = a+b;
double Min = fabs(a-b);
cin>>T;
while (T--)
{
cin>>x>>y;
double len = sqrt(x*x+y*y);
if (len<=Max&&len>=Min)
printf("0.00000000\n");
else
{
printf("%.8lf\n",min(fabs(len-Min),fabs(len-Max)));
}
}
return 0;
}