• bzoj1857 [Scoi2010]传送带


    Description

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

    Input

    输入数据第一行是4个整数,表示A和B的坐标,分别为Ax,Ay,Bx,By 第二行是4个整数,表示C和D的坐标,分别为Cx,Cy,Dx,Dy 第三行是3个整数,分别是P,Q,R

    Output

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

    Sample Input

    0 0 0 100
    100 0 100 100
    2 2 1


    Sample Output

    136.60

    HINT

    对于100%的数据,1<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
    1<=P,Q,R<=10

    正解:三分套三分。

    第一次正经地打三分。。以前只在考试中为了压常数而写了个三分$CDQ$分治。。

    比较显然的思路。。外面三分从$AB$中哪个点出去,里面三分从$CD$中哪个点进来,然后就是个单峰函数,判断一下就行了。

     1 //It is made by wfj_2048~
     2 #include <algorithm>
     3 #include <iostream>
     4 #include <complex>
     5 #include <cstring>
     6 #include <cstdlib>
     7 #include <cstdio>
     8 #include <vector>
     9 #include <cmath>
    10 #include <queue>
    11 #include <stack>
    12 #include <map>
    13 #include <set>
    14 #define inf (1<<30)
    15 #define eps (1e-3)
    16 #define il inline
    17 #define RG register
    18 #define ld long double
    19 #define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
    20 
    21 using namespace std;
    22 
    23 ld ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
    24 
    25 il ld gettime(RG ld x1,RG ld y1,RG ld x2,RG ld y2,RG ld v){
    26     return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))/v;
    27 }
    28 
    29 il ld calc(RG ld x,RG ld y){
    30     RG ld lx=cx,ly=cy,rx=dx,ry=dy,x1,y1,x2,y2,t1,t2;
    31     while (fabs(rx-lx)>eps || fabs(ry-ly)>eps){
    32     x1=lx+(rx-lx)/3,y1=ly+(ry-ly)/3;
    33     x2=x1+(rx-lx)/3,y2=y1+(ry-ly)/3;
    34     t1=gettime(x,y,x1,y1,r)+gettime(x1,y1,dx,dy,q);
    35     t2=gettime(x,y,x2,y2,r)+gettime(x2,y2,dx,dy,q);
    36     if (t1>t2) lx=x1,ly=y1; else rx=x2,ry=y2;
    37     }
    38     return gettime(ax,ay,x,y,p)+gettime(x,y,lx,ly,r)+gettime(lx,ly,dx,dy,q);
    39 }
    40 
    41 il void work(){
    42     cin>>ax>>ay>>bx>>by>>cx>>cy>>dx>>dy>>p>>q>>r;
    43     RG ld lx=ax,ly=ay,rx=bx,ry=by,x1,y1,x2,y2,t1,t2;
    44     while (fabs(rx-lx)>eps || fabs(ry-ly)>eps){
    45     x1=lx+(rx-lx)/3,y1=ly+(ry-ly)/3;
    46     x2=x1+(rx-lx)/3,y2=y1+(ry-ly)/3;
    47     if (calc(x1,y1)>calc(x2,y2)) lx=x1,ly=y1; else rx=x2,ry=y2;
    48     }
    49     printf("%0.2Lf
    ",calc(lx,ly)); return;
    50 }
    51 
    52 int main(){
    53     File("belt");
    54     work();
    55     return 0;
    56 }
  • 相关阅读:
    Android开发系列(十七)QQ聊天之Android显示Gif ——在TextView中添加动态表情
    玩转Hook——Android权限管理功能探讨(二)
    玩转Hook——Android权限管理功能探讨(一)
    由一个简单算法想到的程序员素养问题
    Android手机间无线互传功能探索及实现
    从字节码的角度看Java内部类与外部类的互相访问
    HttpClient与HttpUrlConnection下载速度比较
    记一道有趣的Twitter面试题
    Android改进版CoverFlow效果控件
    Android应用如何监听自己是否被卸载及卸载反馈功能的实现(第二版)
  • 原文地址:https://www.cnblogs.com/wfj2048/p/7157232.html
Copyright © 2020-2023  润新知