CF 65C Harry Potter and the Golden Snitch(空间向量+二分)

来源:互联网 发布:linux 删除samba用户 编辑:程序博客网 时间:2024/06/05 21:08

题意:哈利波特要去追一个小偷,小偷沿着一条路线逃走,起点在原点(0,0,0),哈利在(Px,Py,Pz),问哈利能不能在一个时间与小偷同时碰面,如果能输出时间和地点,不能就输出NO。

思路:开始直接暴力枚举时间,果断TLE了,然后就想到了二分,先用数组d[i]记录原点到i的总距离,然后二分时间,利用d[]数组找到是在哪一个路段碰面,然后找到 t 时间的坐标,找到最小的时间 t 就是答案。

#include<iostream>#include<cstdio>#include<string.h>#include<algorithm>#include<math.h>#include<queue>#include<stack>#include<map>#include<vector>#define mm(a,b) memset(a,b,sizeof(a))using namespace std;const int inf=0x7ffffff;const double PI=acos(-1.0);const double eps=1e-10;const double e=2.7182818284590452354;double d[10010];double vs,vp;struct point{double x,y,z;point() {}point(double x,double y,double z): x(x),y(y),z(z) {}}p[10010],op,s;point ox=point(1,0,0);point oy=point(0,1,0);point oz=point(0,0,1);point operator - (point a,point b) {return point(a.x-b.x,a.y-b.y,a.z-b.z);}point operator + (point a,point b) {return point(a.x+b.x,a.y+b.y,a.z+b.z);}point operator * (double a,point b) {return point(a*b.x,a*b.y,a*b.z);}double getcos(point a,point b){return (a.x*b.x+a.y*b.y+a.z*b.z)/(sqrt(a.x*a.x+a.y*a.y+a.z*a.z)*sqrt(b.x*b.x+b.y*b.y+b.z*b.z));}double getdist(point a,point b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));}bool solve(double t){int i=0;while(vs*t>d[i+1])i++;double tt=t-d[i]/vs;point dir=p[i+1]-p[i];double vx=vs*getcos(dir,ox);double vy=vs*getcos(dir,oy);double vz=vs*getcos(dir,oz);s=point(p[i].x+vx*tt,p[i].y+vy*tt,p[i].z+vz*tt);if(t*vp-getdist(op,s)>=eps)return 1;else return 0;}int main(){int n;while(~scanf("%d",&n)){for(int i=0;i<=n;i++)scanf("%lf%lf%lf",&p[i].x,&p[i].y,&p[i].z);scanf("%lf%lf",&vp,&vs);scanf("%lf%lf%lf",&op.x,&op.y,&op.z);for(int i=1;i<=n;i++)d[i]=d[i-1]+getdist(p[i],p[i-1]);if((getdist(op,p[n])-vp*(d[n]/vs))>eps){puts("NO");continue;}puts("YES");double left=0;double right=d[n]/vs;while(left+eps<right){double mid=(left+right)/2;if(solve(mid))right=mid;else left=mid;}printf("%.12lf\n",left);printf("%.12lf %.12lf %.12lf\n",s.x,s.y,s.z);}return 0;}


原创粉丝点击