• NOIP 模拟 $87; m 聚烷撑乙二醇$


    题解 (by;zjvarphi)

    倒序递推。

    显然如果放弃当前组而去选下一组,肯定是因为剩下的组的期望大于当前求的值。

    只有一组的时候期望是 (frac{l+r}{2}),有两组的时候,当选的数小于下一组的期望时肯定会去选下一组,大于时选当前。

    设下一组的期望是 (tmp),当前区间为 (l,r),那么在随的数位于 ([l,tmp)) 时,期望是 (tmp),位于 ([tmp,r]) 时,因为一定会选,所以期望就是 (frac{tmp+r}{2}),最后再根据比例加起来就是当前组的期望。

    答案就是第一组的期望。

    Code
    #include<bits/stdc++.h>
    #define ri signed
    #define pd(i) ++i
    #define bq(i) --i
    #define func(x) std::function<x>
    namespace IO{
        char buf[1<<21],*p1=buf,*p2=buf;
        #define gc() p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?(-1):*p1++
        #define debug1(x) std::cerr << #x"=" << x << ' '
        #define debug2(x) std::cerr << #x"=" << x << std::endl
        #define Debug(x) assert(x)
        struct nanfeng_stream{
            template<typename T>inline nanfeng_stream &operator>>(T &x) {
                bool f=false;x=0;char ch=gc();
                while(!isdigit(ch)) f|=ch=='-',ch=gc();
                while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=gc();
                return x=f?-x:x,*this;
            }
        }cin;
    }
    using IO::cin;
    namespace nanfeng{
        #define FI FILE *IM
        #define FO FILE *OUT
        template<typename T>inline T cmax(T x,T y) {return x>y?x:y;}
        template<typename T>inline T cmin(T x,T y) {return x>y?y:x;}
        using db=long double;
        static const int N=1e6+7;
        int l[N],r[N],n;
        bool fg=true;
        db nw;
        inline int main() {
            FI=freopen("pag.in","r",stdin);
            FO=freopen("pag.out","w",stdout);
            cin >> n;
            for (ri i(1);i<=n;pd(i)) cin >> l[i] >> r[i],fg&=(l[i]==r[i]);
            if (fg) {
                int mx=0;
                for (ri i(1);i<=n;pd(i)) mx=cmax(mx,l[i]);
                printf("%.5lf
    ",1.0*mx);
            } else {
                nw=(1.0*(l[n]+r[n]))/2.0;
                for (ri i(n-1);i;bq(i)) {
                    db tl=l[i],tr=r[i];
                    if (tr<=nw) continue;
                    if (tl>=nw) nw=(tl+tr)/2.0;
                    nw=((nw-tl)*nw+(tr-nw)*((nw+tr)/2.0))/(tr-tl);
                }
                printf("%.5Lf
    ",nw);
            }
            return 0;
        }
    }
    int main() {return nanfeng::main();}
    

    记得要开 long double,因为这题卡精度。

  • 相关阅读:
    vim中自动添加文件的作者、时间信息、版本等
    linux shell ipaddress
    java ant学习
    ganglia rpm安装
    深入分析 Java 中的中文编码问题
    javaIO调优
    超强的vim设置
    linux中core文件的生成和配置
    C和C++ 语言动态内存分配
    Linux的常用命令
  • 原文地址:https://www.cnblogs.com/nanfeng-blog/p/15494370.html
Copyright © 2020-2023  润新知