zoukankan      html  css  js  c++  java
  • 【XSY2131】【BZOJ1857】【SCOI2010】传送带

    Description

    题目描述:

    在一个二维平面上有两条传送带,每一条传送带可以看成是一条线段。两条传送带分别为线段AB和线段CD。小y在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R。现在,小y想从A点走到D点,请问他最少需要走多长时间。
    

    输入格式:

    第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By。

    第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy。

    第三行是3个整数,分别是P,Q,R。

    输出格式:

    输出一行一个数,表示小y从A点走到D点的最短时间,保留到小数点后2位。
    

    样例输入:

    0 0 0 100

    100 0 100 100

    2 2 1

    样例输出:

    136.60

    数据范围:

    对于30%的数据满足:

    1<=Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=10

    1<=P,Q,R<=5

    对于100%的数据满足:

    1<=Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000

    1<=P,Q,R<=10

    因为本题的取点所对答案产生的影响不满足单调性,所以我们考虑三分。

    因为AB上要取一个点,CD上要取一个点,所以用三分套三分。

    第一个三分AB上的点,第二个三分CD上的点使得在取第一次三分出来的点的情况下点A到点D的距离最小。

    两个点皆取最优即可得到全局最优。

    代码:

    #include<bits/stdc++.h>
    #define eps 0.0000001
    using namespace std;
    double p,q,r;
    struct data
    {
    	double x,y;
    }a,b,c,d;
    double dis(data a,data b)
    {
    	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
    }
    double getdis(data ab,double x)//求从第一次三分出来的点到第二次三分出来的点在到点D的距离
    {
    	data cd;
    	cd.x=c.x+(d.x-c.x)*x;
    	cd.y=c.y+(d.y-c.y)*x;
    	return dis(ab,cd)/r+dis(cd,d)/q;
    }
    double work(double x)
    {
    	data ab;
    	ab.x=a.x+(b.x-a.x)*x;
    	ab.y=a.y+(b.y-a.y)*x;
    	double l2=0,r2=1;
    	while(r2-l2>eps)//第二次三分
    	{
    		double midl=(r2+l2*2)/3.0,midr=(r2*2+l2)/3.0;
    		if(getdis(ab,midl)<getdis(ab,midr))
    		{
    			r2=midr;
    		}else{
    			l2=midl;
    		}
    	}
    	return getdis(ab,r2)+dis(a,ab)/p;
    }
    int main()
    {
    	scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y,&p,&q,&r);
    	double l1=0,r1=1;
    	while(r1-l1>eps)//第一次三分
    	{
    		double midl=(r1+l1*2)/3.0,midr=(r1*2+l1)/3.0;
    		if(work(midl)<work(midr))
    		{
    			r1=midr;
    		}else{
    			l1=midl;
    		}
    	}
    	printf("%.2lf
    ",work(r1));//输出答案
    	return 0;
    }
    
  • 相关阅读:
    sql测试
    sql时间和日期函数
    递归算法
    冒泡排序
    Ajax
    省市区下拉框三级联动
    Repeater用法
    WIndows form Linq多表联合
    C# 递归算羊
    C# 定义一个学生的结构体,输入学生信息,学号,姓名,身高,按身高排序输出
  • 原文地址:https://www.cnblogs.com/2017gdgzoi44/p/11421216.html
Copyright © 2011-2022 走看看