• bzoj3695: 滑行


    Description

        首长NOI惨跪,于是去念文化课了。现在,他面对一道物理题。
        现在有一个小滑块可以在地面上滑行,地面上被划分成不同的区域,使得小滑块在不同的
    区域内部有一个不同的速度上限。
        小滑块在(0,0)点,我们现在要推动小滑块到目标点(x,y)。
        地面上有N层区域,每层区域都是矩形,现在给你一个序列{Hi}表示每层区域的高度,覆盖的地面横坐标范围是0~X,第i个区域的限速是vi。
        注: Y=Sigma(Hi) 其中i从1到N
    其它的地方小滑块不允许进入。
    现在我们要设计一个路线使得小滑块滑到目标点的用时最小。

    Input

      第一行两个整数,分别表示N、x。
      第二行N个整数,第i个数表示Hi。。
      第三行N个整数,第i个数表示Vi。

    Output

      一行一个整数,表示最小用时,保留到小数点后第三位。

    可以证明按光的折射定律走是最优的,二分初始角度的正弦并判定
    #include<cstdio>
    #include<cmath>
    typedef long double ld;
    int n,x;
    ld a[107],v[107];
    int main(){
        scanf("%d%d",&n,&x);
        for(int i=1;i<=n;++i)scanf("%llf",a+i);
        for(int i=1;i<=n;++i)scanf("%llf",v+i);
        ld L=0,R=1,M;
        while(R-L>1e-13l){
            M=(L+R)/2;
            ld s=M,d=a[1]*s/sqrt(1-s*s);
            for(int i=2;i<=n&&d<=x;++i){
                s*=v[i]/v[i-1];
                if(s>=1){
                    d=x+1;
                    break;
                }
                d+=a[i]*s/sqrt(1-s*s);
            }
            if(d>=x)R=M;
            else L=M;
        }
        ld s=L,t=a[1]/sqrt(1-s*s)/v[1];
        for(int i=2;i<=n;++i){
            s*=v[i]/v[i-1];
            t+=a[i]/sqrt(1-s*s)/v[i];
        }
        printf("%.3Lf",t);
        return 0;
    }
  • 相关阅读:
    PAT (Basic Level) Practise 1013 数素数
    PAT (Basic Level) Practise 1014 福尔摩斯的约会
    codeforces 814B.An express train to reveries 解题报告
    KMP算法
    rsync工具
    codeforces 777C.Alyona and Spreadsheet 解题报告
    codeforces 798C.Mike and gcd problem 解题报告
    nginx + tomcat多实例
    MongoDB副本集
    指针的艺术(转载)
  • 原文地址:https://www.cnblogs.com/ccz181078/p/6266473.html
Copyright © 2020-2023  润新知