bzoj3695 滑行
有个东西叫光路最速。。。
所以我们二分出射角度,由折射定律算出入射位置验证。
#include <math.h> #include <stdio.h> #include <string.h> #include <algorithm> #define eps 1e-6 using namespace std; const int MAXN=105; typedef double db; const db pi=acos(-1.); int n; db x,ans,h[MAXN],v[MAXN]; inline db check(db t){ db x=0,y;ans=0; for(int i=1;i<=n;++i){ y=h[i]*tan(t); x+=y; ans+=sqrt(h[i]*h[i]+y*y)/v[i]; if(i<n)t=asin(v[i+1]*sin(t)/v[i]); } return x; } int main(){ scanf("%d%lf",&n,&x); for(int i=n;i;--i)scanf("%lf",h+i); for(int i=n;i;--i)scanf("%lf",v+i); db l=0,r=pi/2.; for(int i=0;i<50;++i){ db mid=(l+r)/2.; if(check(mid)>x)r=mid; else l=mid; } printf("%.3f\n",ans); return 0; }