- P2571 [SCOI2010]传送带
- 题意:
- 思路 :分析一波发现,当从AB传送带上离开的位置坐标距离A的远近 与最终的时间 是一个单峰函数,同理
- 在CD上的点也是单峰函数,所以进行三分一下AB上的坐标 ,check时再对CD上的坐标进行三分。
-
#include<bits/stdc++.h> using namespace std; double ax,ay,bx,by,cx,cy; double dx,dy,q,p,r; double lx,rx,ly,ry,ans; double mx1,mx2,my1,my2; double dis(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } double ok(double x,double y) { double llx=cx,lly=cy,rrx=dx,rry=dy; double ret=dis(ax,ay,x,y)/p; while((abs(rrx-llx)>1e-3)||(abs(rry-lly)>1e-3)) { double x1=llx+(rrx-llx)/3,x2=rrx-(rrx-llx)/3; double y1=lly+(rry-lly)/3,y2=rry-(rry-lly)/3; double s1=dis(x,y,x1,y1)/r+dis(dx,dy,x1,y1)/q; double s2=dis(x,y,x2,y2)/r+dis(dx,dy,x2,y2)/q; if(s1<s2)rrx=x2,rry=y2; else llx=x1,lly=y1; } ret+=dis(llx,lly,x,y)/r+dis(llx,lly,dx,dy)/q; return ret; } int main() { scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by); scanf("%lf%lf%lf%lf",&cx,&cy,&dx,&dy); scanf("%lf%lf%lf",&p,&q,&r); lx=ax,ly=ay,rx=bx,ry=by; while((abs(rx-lx)>1e-3)||(abs(ry-ly)>1e-3)) { mx1=lx+(rx-lx)/3,mx2=rx-(rx-lx)/3; my1=ly+(ry-ly)/3,my2=ry-(ry-ly)/3; if(ok(mx1,my1)>ok(mx2,my2))lx=mx1,ly=my1; else rx=mx2,ry=my2; } ans=ok(lx,ly); printf("%.2lf\n",ans); return 0; }
P2571 [SCOI2010]传送带-三分套三分
最新推荐文章于 2020-06-11 12:04:28 发布