传送门:HDU - 6559
题意
在一个三维空间,给定一个点和他的三维速度,给定一个圆锥,问这个点最早什么时候能撞上圆锥。
题解
本来一直想着怎么求圆锥的方程,然后....队友:这不是二分吗!然后问题就转换成了要怎么求当前时间是不是已经穿过了圆锥了....然后就gg了。
正解就是联立:
① r ' = (h-z)/h*r
② x=x0+vx*t; y=y0+vy*t; z=z0+vz*t;
③ x2+y2=r ' 2
然后就可以求解出 t 了(这个一元二次方程及其麻烦.....)不知道为啥直接输出t1就可以了,而不是输出非负的最小值....(逃
代码
1 #include<bits/stdc++.h> 2 #define eps 1e-12 3 using namespace std; 4 5 double r,h; 6 double x,y,z; 7 double vx,vy,vz; 8 9 int main() 10 { 11 int t; 12 scanf("%d",&t); 13 int tt=0; 14 while(t--){ 15 scanf("%lf%lf",&r,&h); 16 scanf("%lf%lf%lf",&x,&y,&z); 17 scanf("%lf%lf%lf",&vx,&vy,&vz); 18 printf("Case %d: ",++tt); 19 double a=(r*r/h/h*vz*vz-vx*vx-vy*vy); 20 double b=-r*r/h/h*(2*h*vz-2*z*vz)-2*x*vx-2*y*vy; 21 double c=-(x*x+y*y-r*r-r*r*z*z/h/h+2*h*z*r*r/h/h); 22 double derta=b*b-4*a*c; 23 double t1=(-b+sqrt(derta))/(2*a); 24 double t2=(-b-sqrt(derta))/(2*a); 25 printf("%.10f ",t1); 26 } 27 return 0; 28 }