P2571 [SCOI2010]传送带
Posted olinr
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2571 [SCOI2010]传送带相关的知识,希望对你有一定的参考价值。
题意:在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。
两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,
在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,
他想知道最少需要走多长时间
这貌似是物理题
第一道三分题,还是三分套三分(厉害了~~)
对AB,CD分别三分,求距离更新答案
因为判不了大小关系,取cnt=50来多次三分(足够了)
#include<cstdio> #include<iostream> #include<cmath> #include<cmath> using namespace std; #define love_nmr 0 int ax,ay,bx,by; int cx,cy,dx,dy; int p,q,R; inline double dis(double x,double y,double xx,double yy) { return sqrt((xx-x)*(xx-x)+(yy-y)*(yy-y)); } struct node { double x,y; }; inline double juli(node t) { double diss=dis(ax,ay,t.x,t.y); node l,r; l.x=cx; l.y=cy; r.x=dx; r.y=dy; double ans=0; int cnt=50; while(cnt--) { node mid1,mid2; mid1.x=(l.x+(r.x-l.x)/3.0); mid1.y=(l.y+(r.y-l.y)/3.0); mid2.x=(r.x-(r.x-l.x)/3.0); mid2.y=(r.y-(r.y-l.y)/3.0); double tot1=diss/(double)p+dis(t.x,t.y,mid1.x,mid1.y)/(double)R+dis(mid1.x,mid1.y,dx,dy)/(double)q; double tot2=diss/(double)p+dis(t.x,t.y,mid2.x,mid2.y)/(double)R+dis(mid2.x,mid2.y,dx,dy)/(double)q; if(tot1>tot2) { ans=tot2; l.x=mid1.x; l.y=mid1.y; } else { ans=tot1; r.x=mid2.x; r.y=mid2.y; } } return ans; } int main() { scanf("%d%d%d%d%d%d%d%d%d%d%d",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&p,&q,&R); node l,r; l.x=ax; l.y=ay; r.x=bx; r.y=by; double ans=0; int cnt=50; while(cnt--) { node mid1,mid2; mid1.x=(l.x+(r.x-l.x)/3.0); mid1.y=(l.y+(r.y-l.y)/3.0); mid2.x=(r.x-(r.x-l.x)/3.0); mid2.y=(r.y-(r.y-l.y)/3.0); double tot1=juli(mid1); double tot2=juli(mid2); if(tot1>tot2) { ans=tot2; l.x=mid1.x; l.y=mid1.y; } else { ans=tot1; r.x=mid2.x; r.y=mid2.y; } } printf("%.2lf",ans); return love_nmr; }
以上是关于P2571 [SCOI2010]传送带的主要内容,如果未能解决你的问题,请参考以下文章