zoukankan      html  css  js  c++  java
  • 【BZOJ1857】传送带(分治经典:三分套三分)

    点此看题面

    大致题意: 一个二维平面上有两条传送带(AB)(CD)(AB)传送带的移动速度为(P)(CD)传送带的移动速度为(Q),步行速度为(R),问你从(A)点到(D)点所需的最短时间。

    什么是最优策略?

    很显然,最优策略一定是在(AB)传送带上移动到某一个地方,然后步行到(CD)传送带的某一个地方,最后直接在(CD)传送带上移动到(D)

    三分套三分

    不难发现,这是两个单谷函数,因此,我们可以对在(AB)传送带上移动的距离和(CD)传送带上移动的距离分别三分,然后合在一起,就变成了三分套三分,这样就能求出答案了。

    代码

    #include<bits/stdc++.h>
    #define max(x,y) ((x)>(y)?(x):(y))
    #define min(x,y) ((x)<(y)?(x):(y))
    #define LL long long
    #define swap(x,y) (x^=y,y^=x,x^=y)
    using namespace std;
    double Ax,Ay,Bx,By,Cx,Cy,Dx,Dy,p,q,r,ans;
    inline double check(double x,double y)//求出这种方案所需的时间
    {
    	double P1x=Ax+(Bx-Ax)*x,P1y=Ay+(By-Ay)*x,P2x=Cx+(Dx-Cx)*y,P2y=Cy+(Dy-Cy)*y;//P1为在AB传送带上移动到的点,P2为开始在CD传送带上移动的点
    	return sqrt((P1x-Ax)*(P1x-Ax)+(P1y-Ay)*(P1y-Ay))/p+sqrt((Dx-P2x)*(Dx-P2x)+(Dy-P2y)*(Dy-P2y))/q+sqrt((P2x-P1x)*(P2x-P1x)+(P2y-P1y)*(P2y-P1y))/r;//计算出A到P1、P1到P2、P2到D分别所需的时间
    }
    inline double find2(double l,double r,double t1)//第2个三分,t1表示在AB传送带上移动的距离占AB传送带总长度的多少,l和r表示在CD传送带上移动的距离占CD传送带总长度的多少
    {
    	double res=0.0;
    	while(r-l>=1e-6)
    	{
    		double mid1=l+(r-l)/3,mid2=l+(r-l)/3*2,res1=check(t1,mid1),res2=check(t1,mid2);
    		if(res1<res2) res=res1,r=mid2;
    		else res=res2,l=mid1;
    	}
    	return res;
    }
    inline void find1(double l,double r)//第1个三分,l和r表示在AB传送带上移动的距离占AB传送带总长度的多少
    {
    	while(r-l>=1e-6)
    	{
    		double mid1=l+(r-l)/3,mid2=l+(r-l)/3*2,res1=find2(0,1,mid1),res2=find2(0,1,mid2);
    		if(res1<res2) ans=res1,r=mid2;
    		else ans=res2,l=mid1;
    	}
    }
    int main()
    {
    	return scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&Ax,&Ay,&Bx,&By,&Cx,&Cy,&Dx,&Dy,&p,&q,&r),find1(0,1),printf("%.2lf",ans),0;//三分套三分即可求出答案
    }
    
  • 相关阅读:
    javaScript实用的一些方法
    ASP.NETCookies的用法
    SqlCommand执行带参数的sql语句
    C# Excel导出
    sql server复制表
    让Double类型完整显示,不用科学计数法显示E
    jstl fmt功能说明
    工具 PL/SQL 快捷键
    sql server 与 oracle 的不同,第一感觉。
    BigDecimal不整除的一个异常
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/BZOJ1857.html
Copyright © 2011-2022 走看看