E - The Tower (计算几何+构造)

it2024-08-17  42

#include<bits/stdc++.h> using namespace std; double r,h; double x0,yy,z0; double vx,vy,vz; double a,b,c; bool check(double t){ double x=x0+vx*t; double y=yy+vy*t; double z=z0+vz*t; if(z>=0&&z<=h&&(x*x+y*y<=r*r)) return 1; return 0; } int main(){ int T;scanf("%d",&T); for(int cas=1;cas<=T;cas++){ scanf("%lf%lf",&r,&h); scanf("%lf%lf%lf",&x0,&yy,&z0); scanf("%lf%lf%lf",&vx,&vy,&vz); a=h*h*vx*vx+h*h*vy*vy-r*r*vz*vz; b=2*x0*vx*h*h+2*h*h*yy*vy-2*r*r*z0*vz+2*r*r*h*vz; c=x0*x0*h*h+yy*yy*h*h-h*h*r*r-z0*z0*r*r+2*h*r*r*z0; double t1=(sqrt(b*b-4*a*c)-b)/(2*a); double t2=-1*(sqrt(b*b-4*a*c)+b)/(2*a); double ans=1e18; if(check(t1)) ans=min(ans,t1); if(check(t2)) ans=min(ans,t2); printf("Case %d: %.10lf\n",cas,ans); } return 0; }

 

最新回复(0)