传送带 951G
来源:牛客网
题目描述
在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB\text{AB}AB和线段CD\text{CD}CD。lxhgww在AB\text{AB}AB上的移动速度为P,在CD\text{CD}CD上的移动速度为Q,在平面上的移动速度R。
现在lxhgww想从A点走到D点,他想知道最少需要走多长时间。
输入描述:
输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,ByA_x,A_y,B_x,B_yAx,Ay,Bx,By; 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,DyC_x,C_y,D_x,D_yCx,Cy,Dx,Dy,; 第三行是3个整数,分别是P,Q,R。
输出描述:
输出数据为一行,表示lxhgww从A点走到D点的最短时间,保留到小数点后2位。
示例1
输入
复制0 0 0 100 100 0 100 100 2 2 1
0 0 0 100 100 0 100 100 2 2 1
输出
复制136.60
136.60
完整代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<sstream>
#include<math.h>
using namespace std;
struct Node{
double x,y;
}a,b,c,d;
double x1,ya,x2,y2,x3,y3,x4,y4;
double p,q,r;
double dis(double xx,double yy,double xxx,double yyy)
{
return sqrt((xxx-xx)*(xxx-xx)+(yyy-yy)*(yyy-yy));
}
double min(double ex,double ey)
{
double sum=(dis(x1,ya,ex,ey))/p;
double midx,midy,mid2x,mid2y;
for(int i=0;i<100;i++)
{
midx=(c.x+d.x)/2;
midy=(c.y+d.y)/2;
mid2x=(midx+d.x)/2;
mid2y=(midy+d.y)/2;
if( dis(ex,ey,midx,midy)/r+dis(midx,midy,x4,y4)/q <dis(ex,ey,mid2x,mid2y)/r+dis(mid2x,mid2y,x4,y4)/q )
{
d.x=mid2x;
d.y=mid2y;
}
else
{
c.x=midx;
c.y=midy;
}
}
return (sum+dis(ex,ey,c.x,c.y)/r+dis(c.x,c.y,x4,y4)/q );
}
int main()
{
cin>>a.x>>a.y>>b.x>>b.y;
cin>>c.x>>c.y>>d.x>>d.y;
x1=a.x;
ya=a.y;
x2=b.x;
y2=b.y;
x3=c.x;
y3=c.y;
x4=d.x;
y4=d.y;
cin>>p>>q>>r;
double midx,midy,mid2x,mid2y;
for(int i=0;i<100;i++)
{
midx=(a.x+b.x)/2;
midy=(a.y+b.y)/2;
mid2x=(midx+b.x)/2;
mid2y=(midy+b.y)/2;
if( min(midx,midy)< min(mid2x,mid2y))
{
b.x=mid2x;
b.y=mid2y;
}
else
{
a.x=midx;
a.y=midy;
}
}
printf("%.2f\n",min(a.x,a.y));
return 0;
}
算法思路
1.二分三分算法:
最常见的二分算法是折半查找,作用:求解一个单调函数的零点;
三分算法
作用:求解一个在一个区间内凹凸函数的极大(小)值
用途:求有俩个变量的函数的最大或最小的(传送带即为这样的问题),假设一个变量为定植求 最 大(小)值,再假设另一个值为定制,求最大(小)问题,然后综合即为最大(小)值。
具体实现:
三分算法也是一种暴力查找法,查找到无限趋近于最好的情况。
2.传送带问题:
其中main函数则为确定了F的位置求E变的最小值,min函数为E为定植,改变F的位置求最小值。
一起敲代码,每日一分享(JN)