bzoj1857: [Scoi2010]传送带
三分套三分。。。其实直接看代码理解就可以了。
发现的新bug:(x,y,a,b)/p 这样的c++语句是合法的,我也不知道为什么,然后因为这一个我调了一节晚自修。。。药丸药丸!
#include<cstdio> #include<cstring> #include<cctype> #include<algorithm> #include<cmath> using namespace std; #define rep(i,s,t) for(int i=s;i<=t;i++) #define dwn(i,s,t) for(int i=s;i>=t;i--) #define clr(x,c) memset(x,c,sizeof(x)) int read(){ int x=0,f=1;char c=getchar(); while(!isdigit(c)) { if(c=='-') f=-1;c=getchar(); } while(isdigit(c)) x=x*10+c-'0',c=getchar(); return x*f; } const int inf=0x7f7f7f7f; const double eps=1e-3; double au,av,bu,bv,cu,cv,du,dv; double p,q,r; double dis(double a,double b,double x,double y){ return sqrt((x-a)*(x-a)+(y-b)*(y-b)); } double cal(double a,double b){ double la=cu,lb=cv,ra=du,rb=dv,xa,ya,xb,yb,ta,tb,orz,tmp; while(fabs(ra-la)>eps||fabs(rb-lb)>eps){ orz=(ra-la)/3;tmp=(rb-lb)/3; xa=orz+la,ya=tmp+lb; xb=orz*2+la,yb=tmp*2+lb; ta=dis(xa,ya,a,b)/r+dis(xa,ya,du,dv)/q; tb=dis(xb,yb,a,b)/r+dis(xb,yb,du,dv)/q; if(ta>tb) la=xa,lb=ya; else ra=xb,rb=yb; } return dis(au,av,a,b)/p+dis(la,lb,a,b)/r+dis(la,lb,du,dv)/q; } int main(){ au=read(),av=read(),bu=read(),bv=read(); cu=read(),cv=read(),du=read(),dv=read(); p=read(),q=read(),r=read(); double la=au,lb=av,ra=bu,rb=bv,xa,ya,xb,yb,ta,tb,orz,tmp; while(fabs(ra-la)>eps||fabs(rb-lb)>eps){ orz=(ra-la)/3;tmp=(rb-lb)/3; xa=orz+la,ya=tmp+lb; xb=orz*2+la,yb=tmp*2+lb; ta=cal(xa,ya);tb=cal(xb,yb); if(ta>tb) la=xa,lb=ya; else ra=xb,rb=yb; } printf("%.2lf\n",cal(la,lb)); return 0; } /* 0 0 0 100 100 0 100 100 2 2 1 */
1857: [Scoi2010]传送带
Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 1191 Solved: 642
[Submit][Status][Discuss]
Description
在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在lxhgww想从A点走到D点,他想知道最少需要走多长时间
Input
输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,R
Output
输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位
Sample Input
0 0 0 100
100 0 100 100
2 2 1
100 0 100 100
2 2 1
Sample Output
136.60
HINT
对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10