标签:ret def cin double return output zoj 保留 mes
http://www.lydsy.com/JudgeOnline/problem.php?id=1857
对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
——————————————————————————————
首先我们取AB一点E,CD一点F,则我们跑了AE+EF+FD。
考虑将其中一个点固定住,那么显然对于另一个点我们三分即可求出这个店的位置(显然该点有最小值,他的左右两点都比他大,所以为单峰函数)。
那么对于最开始的点,我们同样也是单峰函数,也可以三分(通过神奇的代数几何可以证明)
所以这题就是三分套三分。
PS:因为这题x1与x2可能相同,所以不能单独三分x或y,必须同时三分(不然代码量太大了)
#include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<iostream> using namespace std; typedef double dl; const int N=100; dl ax,ay,bx,by,cx,cy,dx,dy,P,Q,R; inline dl dis(dl x,dl y,dl xx,dl yy){ return sqrt((x-xx)*(x-xx)+(y-yy)*(y-yy)); } dl sff(dl x,dl y){ dl lx=cx,rx=dx,ly=cy,ry=dy; dl lfx,lfy,rfx,rfy; for(int i=1;i<=N;i++){ lfx=(lx*2+rx)/3;lfy=(ly*2+ry)/3; rfx=(lfx+rx)/2;rfy=(lfy+ry)/2; dl t1=dis(lfx,lfy,dx,dy)/Q+dis(lfx,lfy,x,y)/R; dl t2=dis(rfx,rfy,dx,dy)/Q+dis(rfx,rfy,x,y)/R; if(t1<t2){ rx=rfx;ry=rfy; }else{ lx=lfx;ly=lfy; } } return dis(lx,ly,dx,dy)/Q+dis(lx,ly,x,y)/R+dis(x,y,ax,ay)/P; } dl sfe(dl lx,dl rx,dl ly,dl ry){ dl lex,ley,rex,rey; for(int i=1;i<=N;i++){ lex=(lx*2+rx)/3;ley=(ly*2+ry)/3; rex=(lex+rx)/2;rey=(ley+ry)/2; if(sff(lex,ley)<sff(rex,rey)){ rx=rex;ry=rey; }else{ lx=lex;ly=ley; } } return sff(lx,ly); } int main(){ cin>>ax>>ay>>bx>>by>>cx>>cy>>dx>>dy>>P>>Q>>R; printf("%.2lf\n",sfe(ax,bx,ay,by)); return 0; }
标签:ret def cin double return output zoj 保留 mes
原文地址:http://www.cnblogs.com/luyouqi233/p/8007039.html