Description
首长NOI惨跪,于是去念文化课了。现在,他面对一道物理题。
现在有一个小滑块可以在地面上滑行,地面上被划分成不同的区域,使得小滑块在不同的
区域内部有一个不同的速度上限。
小滑块在(0,0)点,我们现在要推动小滑块到目标点(x,y)。
地面上有N层区域,每层区域都是矩形,现在给你一个序列{Hi}表示每层区域的高度,覆盖的地面横坐标范围是0~X,第i个区域的限速是vi。
注: Y=Sigma(Hi) 其中i从1到N
其它的地方小滑块不允许进入。
现在我们要设计一个路线使得小滑块滑到目标点的用时最小。
Input
第一行两个整数,分别表示N、x。
第二行N个整数,第i个数表示Hi。。
第三行N个整数,第i个数表示Vi。
Output
一行一个整数,表示最小用时,保留到小数点后第三位。
可以证明按光的折射定律走是最优的,二分初始角度的正弦并判定
#include<cstdio> #include<cmath> typedef long double ld; int n,x; ld a[107],v[107]; int main(){ scanf("%d%d",&n,&x); for(int i=1;i<=n;++i)scanf("%llf",a+i); for(int i=1;i<=n;++i)scanf("%llf",v+i); ld L=0,R=1,M; while(R-L>1e-13l){ M=(L+R)/2; ld s=M,d=a[1]*s/sqrt(1-s*s); for(int i=2;i<=n&&d<=x;++i){ s*=v[i]/v[i-1]; if(s>=1){ d=x+1; break; } d+=a[i]*s/sqrt(1-s*s); } if(d>=x)R=M; else L=M; } ld s=L,t=a[1]/sqrt(1-s*s)/v[1]; for(int i=2;i<=n;++i){ s*=v[i]/v[i-1]; t+=a[i]/sqrt(1-s*s)/v[i]; } printf("%.3Lf",t); return 0; }