1. 程式人生 > >codeforces 235 B lets play osu!

codeforces 235 B lets play osu!

... 計算機 for 時序 con 計算機科學 let ons force

cf235B

一道有意思的題。(據說是美少女(偽)計算機科學家出的,hh)

根據題目要求,就是求ni^2的和。

而n^2=n*(n-1)+n; n*(n-1)=C(n,2)*2;

所以∑ai^2=∑ai+2*∑C(n,2)

化為求連續長度大於2的序列個數;這樣好像還是不太好直接做

設dp【i】=以i結尾的期望長度; dp【0】=dp【1】=0,dp【2】=p1p2,dp【3】=p1p2p3+p2p3=(dp【2】+p【2】)*p3 ...

得dp【i】=p【i】*(dp【i-1】+p【i-1】)

而發現dp【0】+dp【1】+...+dp【i】恰好包括了長度為i時序列長度超過2的所有情況,就可以接著做了

另一種思路:

設當前長為L,則下一個若也為o,那麽貢獻增加為(L+1)^2-L^2=2L+1

設dp【i】=以i結尾的期望長度;

得到dp【i】=(dp【i-1】+1)*p【i】

就可以累加了

代碼

#include<bits/stdc++.h>
using namespace std;

const int maxn=100010;
int n;

double ans;
int main()
{
    while(scanf("%d",&n)==1)
    {
        ans=0;double cnt=0;double p;
        for(int
i=1;i<=n;i++) { scanf("%lf",&p); ans+=(2*cnt+1)*p; cnt=(cnt+1)*p; } printf("%.15lf\n",ans); } return 0; }

codeforces 235 B lets play osu!