聚烷撑乙二醇(数学+期望)
生活随笔
收集整理的這篇文章主要介紹了
聚烷撑乙二醇(数学+期望)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
problem
有 nnn 個隨機數生成器,第 iii 個生成器可以均勻隨機地生成 [Li,Ri][L_i,R_i][Li?,Ri?] 內的一個實數。
現在你要玩個游戲,從第 111 個生成器到第 nnn 個生成器,每次當前生成器會生成一個數,你需要選擇:
求使用使得期望答案最大的策略時,期望答案是多少。
solution
observation:對于一個均勻隨機生成 [Li,Ri][L_i,R_i][Li?,Ri?] 的生成器,生成數的期望為 Li+Ri2\frac{L_i+R_i}{2}2Li?+Ri??。
顯然,如果上一個生成器產生的期望為 xxx,下一個生成器產生數的期望 yyy,且 x<yx<yx<y,肯定是選擇下一個生成器。
更一般地,從后往前推。
設 fi:f_i:fi?: 從第 iii 個生成器開始游戲得到的最大期望。
比較與 Li?1,Ri?1L_{i-1},R_{i-1}Li?1?,Ri?1? 的大小關系。
- fi>Ri?1f_{i}>R_{i-1}fi?>Ri?1?,則 fi?1=fif_{i-1}=f_{i}fi?1?=fi?
- fi<Li?1f_{i}<L_{i-1}fi?<Li?1?,則 fi?1=Li?1+Ri?12f_{i-1}=\frac{L_{i-1}+R_{i-1}}{2}fi?1?=2Li?1?+Ri?1??
- otherwise\text{otherwise}otherwise,k=fi?Li?1Ri?1?Li?1?fi?1=k?fi+(1?k)?(fi+Ri?1)2k=\frac{f_{i}-L_{i-1}}{R_{i-1}-L_{i-1}}\Rightarrow f_{i-1}=k*f_{i}+(1-k)*\frac{(f_i+R_{i-1})}{2}k=Ri?1??Li?1?fi??Li?1???fi?1?=k?fi?+(1?k)?2(fi?+Ri?1?)?
計算方法就是加權平均。
code
#include <cstdio> #include <iostream> using namespace std; #define double long double #define maxn 1000005 #define eps 1e-7 int n; double l[maxn], r[maxn], f[maxn];int main() {freopen( "pag.in", "r", stdin );freopen( "pag.out", "w", stdout );scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) scanf( "%Lf %Lf", &l[i], &r[i] );f[n] = ( l[n] + r[n] ) / 2;for( int i = n - 1;i;i -- ) {if( f[i + 1] - r[i] >= eps ) f[i] = f[i + 1];else if( f[i + 1] - l[i] >= eps ) {double k = ( f[i + 1] - l[i] ) / ( r[i] - l[i] );f[i] = k * f[i + 1] + ( 1 - k ) * ( r[i] + f[i + 1] ) / 2;}else f[i] = ( l[i] + r[i] ) / 2;}double ans = 0;for( int i = 1;i <= n;i ++ ) ans = max( ans, f[i] );printf( "%.5Lf\n", ans );return 0; }總結
以上是生活随笔為你收集整理的聚烷撑乙二醇(数学+期望)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac如何卸载软件 三步彻底删除
- 下一篇: 我的世界怎么换皮肤 方法很简单