syoj.1827. 线段传送带题解
省流:三分套三分。
在二维平面上有两个传送带,一个从 A 点到 B 点,一个从 C 点到 D 点,速度分别是 p 和 q,在平面内其他点的速度为 r。求 A 点到 D 点的最小速度。
考虑从 A 到 D 的路程一定是
所以答案求一个
不妨将这个式子拆成两个函数,以确定参数 E,对于
同理,上式外面再套一个求 E 的式子,解出一个 E 使得
于是三分套三分。
#include<bits/stdc++.h>
#define db double
using namespace std;
const db eps=1e-6;
db ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
db dis(db x,db y,db xx,db yy){
return sqrt((yy-y)*(yy-y)+(xx-x)*(xx-x));
}
db f3(db x,db y,db xx,db yy){//E & F
return dis(x,y,xx,yy)/r+dis(xx,yy,dx,dy)/q;
}
db f2(db ex,db ey){//F
db lx=cx,ly=cy,rx=dx,ry=dy;//CD
while(dis(lx,ly,rx,ry)>eps){
db x=(rx-lx)/3.0,y=(ry-ly)/3.0;
db lmidx=lx+x,lmidy=ly+y,rmidx=rx-x,rmidy=ry-y;
db ans1=f3(ex,ey,lmidx,lmidy);
db ans2=f3(ex,ey,rmidx,rmidy);
if(ans2-ans1>eps) rx=rmidx,ry=rmidy;
else lx=lmidx,ly=lmidy;
}
return f3(ex,ey,lx,ly);
}
db f1(){//E
db lx=ax,ly=ay,rx=bx,ry=by;
while(dis(lx,ly,rx,ry)>eps){//AB
db x=(rx-lx)/3.0,y=(ry-ly)/3.0;
db lmidx=lx+x,lmidy=ly+y,rmidx=rx-x,rmidy=ry-y;
db ans1=f2(lmidx,lmidy)+dis(ax,ay,lmidx,lmidy)/p;
db ans2=f2(rmidx,rmidy)+dis(ax,ay,rmidx,rmidy)/p;
if(ans2-ans1>eps) rx=rmidx,ry=rmidy;
else lx=lmidx,ly=lmidy;
}
return f2(lx,ly)+dis(ax,ay,lx,ly)/p;
}
int main(){
scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&p,&q,&r);
printf("%.2lf",f1());
return 0;
}
本文作者:Moyyer_suiy
本文链接:https://www.cnblogs.com/Moyyer-suiy/p/17914384.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步