JZOJ 3468. 【NOIP2013模拟联考7】OSU!(osu)
生活随笔
收集整理的這篇文章主要介紹了
JZOJ 3468. 【NOIP2013模拟联考7】OSU!(osu)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Description
osu 是一款群眾喜聞樂見的休閑軟件。
我們可以把osu的規則簡化與改編成以下的樣子:
一共有n次操作,每次操作只有成功與失敗之分,成功對應1,失敗對應0,n次操作對應為一個長度為n的01串。在這個串中連續的x個1可以貢獻x^3的分數,這x個1不能被其他連續的1所包含(也就是極長的一串1,具體見樣例解釋)
現在給出n,以及每個操作的成功率,請你輸出期望分數,輸出四舍五入后保留1位小數。
Input
輸入文件osu.in的第一行有一個正整數n,表示操作個數。接下去n行每行有一個[0,1]之間的實數,表示每個操作的成功率。
Output
輸出文件osu.out只有一個實數,表示答案。答案四舍五入后保留1位小數。
Sample Input
3
0.5
0.5
0.5
Sample Output
6.0
【樣例說明】
000分數為0,001分數為1,010分數為1,100分數為1,101分數為2,110分數為8,011分數為8,111分數為27,總和為48,期望為48/8=6.0
Data Constraint
30%的數據 n<=20
60%的數據 n<=1000
100%的數據 n<=100000
Solution
期望DP。
每一位都加上必選這一位的 期望長度^3 即可。
利用立方差、平方和公式即可 O(1) 維護所需值。(詳見代碼)
Code
#include<cstdio> #include<cctype> using namespace std; const int N=1001; int n; double ans,X1,X2; inline double read()//實數讀入優化 {double X=0,Y=1.0; int w=0; char ch=0;while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}while(isdigit(ch)) X=X*10+(ch^48),ch=getchar();ch=getchar();while(isdigit(ch)) X+=(Y/=10)*(ch^48),ch=getchar();return w?-X:X; } int main() {scanf("%d",&n);while(n--){double p=read();// i 是期望長度ans+=(3*X2+3*X1+1)*p;// (i+1)^3 = i^3 + 3*i^2 + 3*i + 1X2=(X2+2*X1+1)*p;// (i+1)^2 = i^2 + 2*i + 1X1=(X1+1)*p;// i= (i+1)*p + 0*(1-p)}printf("%.1lf",ans);return 0; }總結
以上是生活随笔為你收集整理的JZOJ 3468. 【NOIP2013模拟联考7】OSU!(osu)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JZOJ 5478. 【NOIP2017
- 下一篇: JZOJ 5483. 【清华集训2017