ShinriiTin's Blog - 博主是sb

bzoj3695 滑行

有个东西叫光路最速。。。

所以我们二分出射角度,由折射定律算出入射位置验证。

Portal

#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;
}