题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6559
参考:https://www.cnblogs.com/Dillonh/p/11196418.html
题意:给定圆锥,以及一个点位置和初始速度,求点和圆锥相撞时间。保证点和圆锥可以相撞。
题解:解方程,详见参考博客,注意找出的两个点要check一下,并取最小值。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const double eps=1e-8;
const ll inf=0x3f3f3f3f3f3f3f3f;
double r,h,x,y,z,vx,vy,vz;
bool check(double t){
double xx=x+vx*t;
double yy=y+vy*t;
double zz=z+vz*t;
double R=(h-zz)*r/h;
return sqrt(xx*xx+yy*yy)-R<=eps;
}
int main(){
int t,cas=1;scanf("%d",&t);
while(t--){
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&r,&h,&x,&y,&z,&vx,&vy,&vz);
double a=vx*vx+vy*vy-r*r*vz*vz/h/h;
double b=2*(vx*x+vy*y-z*vz*r*r/h/h+vz*r*r/h);
double c=x*x+y*y-r*r/h/h*(h-z)*(h-z);
double ans1=(-b+sqrt(b*b-4*a*c))/(2*a);
double ans2=(-b-sqrt(b*b-4*a*c))/(2*a);
double ans=inf;
if(check(ans1)) ans=ans1;
if(check(ans2)) ans=min(ans,ans2);
printf("Case %d: %.10f\n",cas++,ans);
}
return 0;
}