• 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,因为这题卡精度。

  • 相关阅读:
    Max History CodeForces
    Buy a Ticket CodeForces
    AC日记——字符串的展开 openjudge 1.7 35
    AC日记——回文子串 openjudge 1.7 34
    AC日记——判断字符串是否为回文 openjudge 1.7 33
    AC日记——行程长度编码 openjudge 1.7 32
    AC日记——字符串P型编码 openjudge 1.7 31
    AC日记——字符环 openjudge 1.7 30
    AC日记——ISBN号码 openjudge 1.7 29
    AC日记——单词倒排 1.7 28
  • 原文地址:https://www.cnblogs.com/nanfeng-blog/p/15494370.html
Copyright © 2020-2023  润新知