现在的位置: 首页 > 综合 > 正文

1857: [Scoi2010]传送带 (三分法)

2018年01月13日 ⁄ 综合 ⁄ 共 1312字 ⁄ 字号 评论关闭

三分法套三分法。

#include<bits/stdc++.h>
#define eps 1e-3
#define dinf 1000000000
using namespace std;
double ax,ay,bx,by,cx,cy,dx,dy,va,vb,vc,k1,b1,k2,b2,len1,len2,rev1=1,rev2=1;
inline double F(double x,double k,double b){
	if(k==dinf)return b;
	return k*x+b;
}
inline double dis(double x1,double y1,double x2,double y2){
	return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
inline double Dist(double l1,double l2){
	double x1,x2,y1,y2;
	if(k1==dinf)x1=ax,y1=ay+rev1*l1;else x1=ax+rev1*l1/sqrt(k1*k1+1),y1=F(x1,k1,b1);
	if(k2==dinf)x2=cx,y2=cy+rev2*l2;else x2=cx+rev2*l2/sqrt(k2*k2+1),y2=F(x2,k2,b2);
	return dis(x1,y1,x2,y2);
}
inline double dist(double l1,double l2){
	return Dist(l1,l2)/vc+(len2-l2)/vb; 
}
inline double calc(double l){
	double L=0,R=len2;
	while(fabs(R-L)>eps){
		double d=(R-L)/3,m1=L+d,m2=R-d;
		if(dist(l,m1)<dist(l,m2))R=m2;
		else L=m1;
	}
	return dist(l,L);
}
inline double solve(){
	double l=0,r=len1;
	while(fabs(r-l)>eps){
		
		double d=(r-l)/3,m1=l+d,m2=r-d;
		if(calc(m1)+m1/va<calc(m2)+m2/va)r=m2;
		else l=m1;
	}
	return calc(l)+l/va;
}
int main(){
	scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&va,&vb,&vc);
	k1=(bx-ax==0)?dinf:(by-ay)/(bx-ax);b1=ay-k1*ax;
	k2=(dx-cx==0)?dinf:(dy-cy)/(dx-cx);b2=cy-k2*cx;
	if(k1<0||(k1==0&&bx<ax)||(k1==dinf&&by<ay))rev1=-1;
	if(k2<0||(k2==0&&dx<cx)||(k2==dinf&&dy<cy))rev2=-1;
	len1=dis(ax,ay,bx,by);len2=dis(cx,cy,dx,dy);
	printf("%.2lf",solve());
	return 0; 
}

抱歉!评论已关闭.