码迷,mamicode.com
首页 > 其他好文 > 详细

传送带

时间:2019-09-29 21:53:29      阅读:88      评论:0      收藏:0      [点我收藏+]

标签:include   三分   思路   amp   比较   二分   pre   无法   pac   

https://loj.ac/problem/10017

题目描述

  给出两条线段AB,CD,并且给出在线段AB,线段CD,平面上的移动速度,求从A点到B点最短的移动时间。

思路

  首先比较容易想到最优的移动路径一定由A到AB上一点P,P到CD上一点Q,Q到D的路径组成。这道题显然应该用三分做,二分是无法过的,因为我们无法保证这个题只是单调增或单调减。但P和Q都需要三分,我们就需要三分套三分。如果三分P、Q的横纵坐标,我们会发现代码比较复杂,所以我们可以三分AQ和AB的比值,以及三分CQ和CD的比值,这样可以发现码量大大减少了。

代码

#include <bits/stdc++.h>
using namespace std;
double ax,bx,cx,dx,ay,by,cy,dy,p,q,r;
double f(double a,double b,double c,double d)
{
    return sqrt((a-c)*(a-c)+(b-d)*(b-d));
}
double check2(double k1,double k2)
{
    double x1=ax+k1*(bx-ax),y1=ay+k1*(by-ay);
    double x2=cx+k2*(dx-cx),y2=cy+k2*(dy-cy);
    return f(ax,ay,x1,y1)/p+f(x1,y1,x2,y2)/r+f(x2,y2,dx,dy)/q;
}
double check(double k)
{
    double l=0,r=1,eps=1e-5;
    while(r-l>eps)
    {
        double lmid=l+(r-l)/3;
        double rmid=r-(r-l)/3;
        if(check2(k,lmid)<=check2(k,rmid))r=rmid;
        else l=lmid;
    }
    return check2(k,r);
}
int main() 
{
    scanf("%lf%lf%lf%lf",&ax,&ay,&bx,&by);
    scanf("%lf%lf%lf%lf",&cx,&cy,&dx,&dy);
    scanf("%lf%lf%lf",&p,&q,&r);
    double l=0,r=1,eps=1e-5;
    while(r-l>eps)
    {
        double lmid=l+(r-l)/3;
        double rmid=r-(r-l)/3;
        if(check(lmid)<=check(rmid))r=rmid;
        else l=lmid;
    }
    printf("%.2lf",check(r));
    return 0;
}

 

传送带

标签:include   三分   思路   amp   比较   二分   pre   无法   pac   

原文地址:https://www.cnblogs.com/fangbozhen/p/11610071.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!