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;
}
题目大意:有两个不相交的线段,端点分别为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;
}
相关文章推荐
- 从无到有写一个C#弹球小游戏(二)
- thinkphp菜鸟学习笔记(一)
- Hello World
- (4.2.1.3)EventBus使用详解(二)——EventBus使用进阶
- Yii2系列教程四:实现用户注册,验证,登录
- [rospack] Error: package 'chapter3_tutorials' not found
- Linux下安装JDK和删除JDK
- mac pf 将本地80端口转发至80端口
- (4.2.1.2)EventBus使用详解(一)——初步使用EventBus
- 第87课:Flume推送数据到SparkStreaming案例实战和内幕源码解密--flume安装篇
- CNNs学习笔记(4):反向传播BP算法
- 一个很city的问题
- 六.Linux系统中的重要命令
- Yii2系列教程三:Database And Gii
- Linux每天学习一个命令之find命令二
- (4.2.1.1)EventBus介绍
- 五.Linux系统中压缩与解压缩命令
- js中的slice,splice,split的区分
- json-lib 使用教程
- hdu-5670 Machine(水题附上java代码)