洛谷P2571 传送带【三分答案】

题目描述 https://www.luogu.org/problemnew/show/P2571
走的路程一定是AE到EF再到FD(其中E在AB上 F在CD上)
E F 都是未知量 需要两次三分 第一次三分确定E ,再此基础上三分找F。

**#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath> 
using namespace std;
const double eps=1e-6;
double ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
double dis(double x1,double y1,double x2,double y2)
{
	double disx=x1-x2,disy=y1-y2;
	return sqrt(disx*disx+disy*disy);
}
double f(double ex,double ey,double fx,double fy)
{
	return dis(ex,ey,fx,fy)/r+dis(fx,fy,dx,dy)/q;
}
double cal2(double x,double y)//E的坐标 内层三分F 
{
	double lx=cx,ly=cy,rx=dx,ry=dy;
	while(dis(lx,ly,rx,ry)>eps)
	{
	   double midx=(rx-lx)/3.0,midy=(ry-ly)/3.0;
	   double lmx=lx+midx,lmy=ly+midy,rmx=rx-midx,rmy=ry-midy;
	   double ansl=f(x,y,lmx,lmy),ansr=f(x,y,rmx,rmy);
	   if(ansr>ansl) rx=rmx,ry=rmy;
	   else lx=lmx,ly=lmy;
	}
	return f(x,y,lx,ly);
}
double cal1()//外层三分E
{
	double lx=ax,ly=ay,rx=bx,ry=by;
	while(dis(lx,ly,rx,ry)>eps)
	{
	   double midx=(rx-lx)/3.0,midy=(ry-ly)/3.0;
	   double lmx=lx+midx,lmy=ly+midy,rmx=rx-midx,rmy=ry-midy;
	   double ansl=dis(ax,ay,lmx,lmy)/p+cal2(lmx,lmy);
	   double ansr=dis(ax,ay,rmx,rmy)/p+cal2(rmx,rmy);
	   if(ansr>ansl) rx=rmx,ry=rmy;
	   else lx=lmx,ly=lmy;
	}
	return dis(ax,ay,lx,ly)/p+cal2(lx,ly);
}
int main() 
{ 
   scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&p,&q,&r);
   printf("%.2lf",cal1());
 	
  return 0;	
}**
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值