【计蒜客 - 蓝桥训练】炮台实验(数学期望,期望dp)
題干:
蒜頭君在玩一個戰爭模擬游戲,他有高度為?1,2,3,\ldots ,n1,2,3,…,n?的炮臺各一個,他需要把這?nn?個炮臺從左往右排成一行,并且炮口都朝向右邊。
在這個游戲中,所有炮臺發射的炮彈會摧毀前方所有高度比自己低的炮臺。每當蒜頭君把?nn?個炮臺排成一行后,可能會有一些炮臺被摧毀。舉個例子:當前有?55?個炮臺,從左到右高度分別為?2,1,3,5,42,1,3,5,4,往右發射炮彈后,高度為?44?的炮臺被高度為?55?的摧毀,高度為?11?的炮臺被高度為?22?的炮臺摧毀,最后只會剩下?2,3,52,3,5?這三個炮臺。
現在蒜頭君想知道,如果隨機地擺放這?nn?個炮臺,最后剩下炮臺個數的期望是多少?比如?n=2n=2?時,有兩種擺放方式,高度序列分別為?1,21,2?和?2,12,1,前者最后剩下?22?個炮臺,后者最后剩下一個炮臺,因此期望為?{(2+1)\over 2}=1.50002(2+1)?=1.5000。
請你求出?n=2019n=2019?時剩下炮臺個數的期望,保留四位小數。
樣例輸入復制
無樣例輸出復制
無?
解題報告:
有n個位置,不同的位置擺放不同的數,共有 n! 的排列。對于留存的炮臺數的期望,可以對每一個數留存下來的概率進行累加從而得到期望值。比如最大的數,無論放在哪,留存下的概率都為1。第二大的數,如果最大的數放在其前面會被摧毀,而放在后面不會被摧毀,所以留存的概率為。最小的數除了放在第一個位置,其余位置都會被摧毀,所以留存的概率為,所以期望為。代入n=2019即可算出答案
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair #define fi first #define se second using namespace std; const int MAX = 2e5 + 5; const ll mod = 1e9+7; int main() {double ans = 0;int n = 2019;for (int i = 1; i <= n; i++) {ans += 1.0 / i;}printf("%.4f\n", ans);return 0;}?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【计蒜客 - 蓝桥训练】炮台实验(数学期望,期望dp)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《三国群英传8》存档修改部分武器代码分享
- 下一篇: 【ZOJ - 3715】Kinderga