博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spoj-BLMIRINA Archery Training
阅读量:5163 次
发布时间:2019-06-13

本文共 2657 字,大约阅读时间需要 8 分钟。

Mirana is an archer with superpower. Every arrow she shoots will get stronger the further it travels. Mirana is currently on the way to warzone.

Since the road is still a long way, Mirana remembers about when she's still in training. In each of her training, Mirana stands on the (0,0) point in a cartesian scale. From that point, she must shoot a circle centered in (x,y) with radius r. Everything happens in z=0.

To maximize the arrow's power, Mirana must shoot the furthest point of the enemy possible. Her arrow travels at the speed of light and will instantly stops the moment it touches the target. On the target, determine the coordinate point that Mirana has to shoot to get maximum power. If multiple coordinate exists, choose the one with the lower x value.

Input

First line is T, number of training (T < 100000). Next T lines each contains 3 space separeted integers x, y, and r for each training (1 < r < x,y < 1000)

Output

For each training, output a line containing the coordinate of the arrow's destination separated by space. Output until 6 digit after decimal point.

Example

Input:3 1 1 1 2 2 1 4 5 2 
Output:0.000000 1.000000 1.088562 2.411438 2.126155 5.699076

 

有一个圆心在(x0,y0),半径是r的圆,要过原点做它的切线,求两个切点中x坐标更小的那个的坐标

解方程……很烦

联立两式:(x-x0)^2+(y-y0)^2=r^2, x^2+y^2=x0^2+y0^2-r^2,得到过两切点的直线方程:

x0x+y0y=x0^2+y0^2-r^2

令k=x0^2+y0^2-r^2,则x0x+y0y=k

上式带入x^2+y^2=k,得到一个x的一元二次方程

(x0^2+y0^2)x^2+(-2kx0)x+(k^2-y^2k)=0

解出来x取小的那个(这肯定有两解的)

然后带回x0x+y0y=k,得到y

这里似乎y会有点精度问题?比如0变成-0.000000

1 #include
2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 #include
9 #include
10 #include
11 #include
12 #define LL long long13 #define inf 0x7ffffff14 #define pa pair
15 #define mkp(a,b) make_pair(a,b)16 #define pi 3.141592653589793238462643383279502884197117 using namespace std;18 inline LL read()19 {20 LL x=0,f=1;char ch=getchar();21 while(ch<'0'||ch>'9'){ if(ch=='-')f=-1;ch=getchar();}22 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}23 return x*f;24 }25 inline void work()26 {27 double x,y,r;scanf("%lf%lf%lf",&x,&y,&r);28 if (x*x+y*y<=r*r){puts("0.00000000 0.00000000");return;}29 long double k=x*x+y*y-r*r;30 long double A=(x*x+y*y),B=-2*k*x,C=k*k-y*y*k;31 long double delta=sqrt(B*B-4*A*C);32 long double ansx=min((-B+delta)/(2*A),(-B-delta)/(2*A)),ansy=sqrt(k-ansx*ansx);33 if (fabs(ansx*x+ansy*y-k)>1e-8)ansy=-ansy;34 double xx=ansx,yy=ansy;35 printf("%.8f %.8f\n",xx,yy);36 }37 int main()38 {39 int T=read();40 while (T--)work();41 }
Spoj BLMIRINA

 

转载于:https://www.cnblogs.com/zhber/p/7153419.html

你可能感兴趣的文章
.net 分布式架构之分布式锁实现(转)
查看>>
吴恩达机器学习笔记 —— 3 线性回归回顾
查看>>
Problem E: Automatic Editing
查看>>
SpringBoot 使用 MyBatis 分页插件 PageHelper 进行分页查询
查看>>
《DSP using MATLAB》Problem 6.17
查看>>
微信公众平台开发实战Java版之如何网页授权获取用户基本信息
查看>>
一周TDD小结
查看>>
sizeof与strlen的用法
查看>>
Linux 下常见目录及其功能
查看>>
开源框架中常用的php函数
查看>>
nginx 的提升多个小文件访问的性能模块
查看>>
set&map
查看>>
集合类总结
查看>>
4.AE中的缩放,书签
查看>>
CVE-2014-6321 && MS14-066 Microsoft Schannel Remote Code Execution Vulnerability Analysis
查看>>
给一次重新选择的机会_您还会选择程序员吗?
查看>>
Mysql MHA高可用集群架构
查看>>
心急的C小加
查看>>
编译原理 First,Follow,select集求法
查看>>
java 浅拷贝和深拷贝
查看>>