zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    线性DP SGU167 I-country
    背包问题 POJ1742 Coins
    背包问题 codevs2210 数字组合
    dfs+贪心 BZOJ4027 [HEOI2015] 兔子与樱花
    spfa最短路+DP BZOJ1003 [ZJOI2006] 物流运输
    矩阵乘法 POJ3070 Fibonacci
    tarjan+spfa最短路 BZOJ1179 [Apio2009] Atm
    欧拉函数 BZOJ2190 [SDOI2008] 仪仗队
    矩阵乘法 洛谷 P3390【模板】矩阵快速幂
    裴蜀定理 BZOJ2299[HAOI2011] 向量
  • 原文地址:https://www.cnblogs.com/ccz181078/p/6266473.html
Copyright © 2011-2022 走看看