Line belt(HDU 3400)(三分套三分)

本文介绍了一种使用三分法解决最短路径问题的方法,通过在两条线段上寻找两个点E和F,使得从起点到终点的总路径长度最小。文章详细解释了如何将三分法应用于两个变量的优化问题,并提供了完整的C++代码实现。

思路瞅的某dalao的这篇博客

https://www.cnblogs.com/cjjsb/p/9179699.html

/*
三分套三分:AB边存在E点,CD边存在F点,假设E点已经在了,只需确定F点的话,可以知道F点在CD边上移动是一个凹形函数,F点已知,确定E点的话
E点在AB上移动其距离函数形成的曲线是一个直线,直线+凹形函数也是凹形函数,所以可以用三分做。在三分确定E的时候,假装E点已经确定了,再E点之内
嵌套三分求F点。大体思路就是这样吧。。呜呜呜呜呜呜~~半吊子工科生的用词不专业,菜哭辽~
*/
#include
#include
#include
#include
#include
const double epp = 1e-6;
using namespace std;

int t,P,Q,R;
struct node{
double x;
double y;
}a,b,c,d;

double dis(node a,node b){
return sqrt((b.x-a.x)(b.x-a.x) + (b.y-a.y)(b.y-a.y));
}

double get2(double p1,double p2){
node X,Y;
X.x = a.x + p1*(b.x-a.x); X.y = a.y + p1*(b.y-a.y);
Y.x = c.x + p2*(d.x-c.x); Y.y = c.y + p2*(d.y-c.y);
return dis(a,X)/P + dis(X,Y)/R + dis(Y,d)/Q;
}

double get1(double x){
double l = 0.0, r = 1.0;
while(r-l > epp){
double lmid = l + (r-l)/3.0, rmid = r - (r-l)/3.0;
if(get2(x,lmid) < get2(x,rmid)) r = rmid;
else l = lmid;
}
return get2(x,l);
}

int main(){
while(~scanf("%d",&t)){
while(t–){
scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
scanf("%d%d%d",&P,&Q,&R);
double l = 0.0, r = 1.0;
while(r-l > epp){
double lmid = l + (r-l)/3.0, rmid = r - (r-l)/3.0;
if(get1(lmid) < get1(rmid)) r = rmid;
else l = lmid;
}
printf("%.2f\n",get1(l));
}
}
return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值