您的位置:首页 > 其它

1006

2016-04-22 22:36 232 查看
题目标号:1006

题目大意:有两个不相交的线段,端点分别为AB,CD有个人从A到AB的某点到CD的某点然后到D,给定A,B,C,D的坐标,而且给AB段速度为p,CD为q,其他为r,求最少的时间。

解题思路:根据题意,这是一个复杂的三分算法题。首先,建立一个结构体储存坐标。然后输入坐标ABCD和各段速度pqr。建立一个函数,用math里面求随机坐标系上两点的距                       离,这个是预处理部分,以后用到。对于寻找最值,整天框架是这样子的。整体先利用三分,选定AB上某点,然后在里面又用个三分算法,求此点对应的CD上的最值                       点,然后求出时间。然后再利用整体的三分判断此两点是否为最值,三分循环即可。整体的框架就是这样子,至于代码细节什么的,根据框架就可以慢慢弄出来了。

做题感想:三分不是很熟悉,对于这样灵活嵌套的应用,不是很会,以后多练习应该。#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double p,q,r;
struct point
{
double x,y;
};
double juli(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double sanfen1(point a,point c,point d)
{
point left,right;
point mid,midmid;
double m,n;
left=c;
right=d;
while(juli(left,right)>=1.0e-10)
{
mid.x=(left.x+right.x)/2;
mid.y=(left.y+right.y)/2;
midmid.x=(mid.x+right.x)/2;
midmid.y=(mid.y+right.y)/2;
m=juli(a,mid)/r+juli(mid,d)/q;
n=juli(a,midmid)/r+juli(midmid,d)/q;
if(m>n)
left=mid;
else
right=midmid;
}
return m;
}
double sanfen2(point a,point b,point c,point d)
{
point left,right;
point mid,midmid;
double m,n;
left=a;
right=b;
while(juli(right,left)>=1.0e-10)
{
mid.x=(left.x+right.x)/2;
mid.y=(left.y+right.y)/2;
midmid.x=(mid.x+right.x)/2;
midmid.y=(mid.y+right.y)/2;
m=juli(a,mid)/p+sanfen1(mid,c,d);
n=juli(a,midmid)/p+sanfen1(midmid,c,d);
if(m>n)
left=mid;
else
right=midmid;
}
return m;
}
int main()
{
int n;
double A;
point a,b,c,d;
cin>>n;
while(n--)
{
cin>>a.x>>a.y>>b.x>>b.y;
cin>>c.x>>c.y>>d.x>>d.y;
cin>>p>>q>>r;
A=sanfen2(a,b,c,d);
cout<<fixed<<setprecision(2)<<A<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: