您的位置:首页 > 其它

JZOJ.4692【NOIP2016提高A组模拟8.14】传送带

2016-08-14 19:31 381 查看

Problem

Description

在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。FTD在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在FTD想从A点走到D点,他想知道最少需要走多长时间

Input

输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,R

Output

输出数据为一行,表示FTD从A点走到D点的最短时间,保留到小数点后2位

Sample Input

0 0 0 100

100 0 100 100

2 2 1

Sample Output

136.60

Data Constraint

对于30%的数据

1<=Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=10

1<=P,Q,R<=5

对于100%的数据

1<=Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000

1<=P,Q,R<=10

Solution

解题方法:三分(属于分治算法中的一种)

在线段AB上三分分出一个转折点,然后线段CD上套一个三分分出一个转折点,计算距离就OK了。

具体方法:取l,r的两个三分点,然后比哪个三分点更优,如果左边的优就将左指针向右移,否则将右指针向左移。



Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#define sp 0.001
using namespace std;
double ax,ay,bx,by,cx,cy,dx,dy,da,db,s1,s2,s3,ans,xi,yi,xa,ya,xb,yb;
double l1,l2,r1,r2,mid1,mid2,mmid1,mmid2,l3,l4,r3,r4,mid3,mid4,mmid3,mmid4,ans1,ans2;
int i,j,n,m;
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
int main()
{
freopen("4692_7.in","r",stdin);
ans=2147483647;
scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by);
scanf("%lf%lf%lf%lf",&cx,&cy,&dx,&dy);
scanf("%lf%lf%lf",&s1,&s2,&s3);
l1=ax;r1=bx;
l2=ay;r2=by;
while (abs(l1-r1)>=sp || abs(l2-r2)>=sp)
{
mid1=l1+(r1-l1)/3;
mid2=l2+(r2-l2)/3;
mmid1=r1-(r1-l1)/3;
mmid2=r2-(r2-l2)/3;
l3=cx;r3=dx;
l4=cy;r4=dy;
ans1=2147483647;
while (abs(l3-r3)>=sp || abs(l4-r4)>=sp)
{
mid3=l3+(r3-l3)/3;
mid4=l4+(r4-l4)/3;
mmid3=r3-(r3-l3)/3;
mmid4=r4-(r4-l4)/3;
da=dis(ax,ay,mid1,mid2)/s1+dis(mid1,mid2,mid3,mid4)/s3+dis(mid3,mid4,dx,dy)/s2;
db=dis(ax,ay,mid1,mid2)/s1+dis(mid1,mid2,mmid3,mmid4)/s3+dis(mmid3,mmid4,dx,dy)/s2;
if (da<db)
{
r3=mmid3;
r4=mmid4;
ans1=min(ans1,da);
} else
{
l3=mid3;
l4=mid4;
ans1=min(ans1,db);
}
}
l3=cx;r3=dx;
l4=cy;r4=dy;
ans2=2147483647;
while (abs(l3-r3)>=sp || abs(l4-r4)>=sp)
{
mid3=l3+(r3-l3)/3;
mid4=l4+(r4-l4)/3;
mmid3=r3-(r3-l3)/3;
mmid4=r4-(r4-l4)/3;
da=dis(ax,ay,mmid1,mmid2)/s1+dis(mmid1,mmid2,mid3,mid4)/s3+dis(mid3,mid4,dx,dy)/s2;
db=dis(ax,ay,mmid1,mmid2)/s1+dis(mmid1,mmid2,mmid3,mmid4)/s3+dis(mmid3,mmid4,dx,dy)/s2;
if (da<db)
{
r3=mmid3;
r4=mmid4;
ans2=min(ans2,da);
} else
{
l3=mid3;
l4=mid4;
ans2=min(ans2,db);
}
}
if (ans1<ans2)
{
r1=mmid1;
r2=mmid2;
ans=min(ans,ans1);
} else
{
l1=mid1;
l2=mid2;
ans=min(ans,ans2);
}
}
printf("%.2lf",ans);
}


——2016.8.14
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: