CodeForces 235B Let's Play Osu!(概率)

www.cnblogs.com/shaokele/


B. Let's Play Osu!##

  Time Limit: 2 Sec Memory Limit: 256 MB

Description###

  You're playing a game called Osu! Here's a simplified version of it. There are n clicks in a game. For each click there are two outcomes: correct or bad. Let us denote correct as "O", bad as "X", then the whole play can be encoded as a sequence of n characters "O" and "X".

  Using the play sequence you can calculate the score for the play as follows: for every maximal consecutive "O"s block, add the square of its length (the number of characters "O") to the score. For example, if your play can be encoded as "OOXOOOXXOO", then there's three maximal consecutive "O"s block "OO", "OOO", "OO", so your score will be \(2^2 + 3^2 + 2^2 = 17\). If there are no correct clicks in a play then the score for the play equals to 0.

  You know that the probability to click the i-th (\(1 ≤ i ≤ n\)) click correctly is pi. In other words, the i-th character in the play sequence has \(p_i\) probability to be "O", \(1 - p_i\) to be "X". You task is to calculate the expected score for your play.

Input###

  The first line contains an integer n (\(1 ≤ n ≤ 10^5\)) — the number of clicks. The second line contains n space-separated real numbers p1, p2, ..., pn (\(0 ≤ pi ≤ 1\)).

  There will be at most six digits after the decimal point in the given pi.

Output###

  Print a single real number — the expected score for your play. Your answer will be considered correct if its absolute or relative error does not exceed \(10 ^{-6}\).

Examples###

input####

  3
  0.5 0.5 0.5

output####

  2.750000000000000

input####

  4
  0.7 0.2 0.1 0.9

output####

  2.489200000000000

input####

  5
  1 1 1 1 1

output####

  25.000000000000000

Note###

  For the first example. There are 8 possible outcomes. Each has a probability of 0.125.

  "OOO"  →  32 = 9;
  "OOX"  →  22 = 4;
  "OXO"  →  12 + 12 = 2;
  "OXX"  →  12 = 1;
  "XOO"  →  22 = 4;
  "XOX"  →  12 = 1;
  "XXO"  →  12 = 1;
  "XXX"  →  0.
  So the expected score is

题目地址 codeforces 235B
题目大意:长度为n的串,每个位置上出现O的概率为pi,连续k个O能得到\(k^2\)的分数,现在求总得分的期望


题解地址 题解
贴一份英文版的题解吧(英文版好理解_

  Let us take a deep look in how this score is calculated. for a n long 'O' block, they contribute \(n^2\) to answer.

  Let us reformat this problem a bit and consider the following problem.

  For each two 'O' pair which is no 'X' between them, they add 2 to score.

  For each 'O',it add 1 to score.

  We can see that these two problem are exact the same.

  Proof:

  for a n long 'O' block,there is \(C_{n}^{2}\) pair of 'O' in it and n 'O' in it.

  \(2C_{n}^{2}+n=n^2.\)

  So for each event(i,j) (which means s[i] and s[j] are 'O', and there's no 'X' between them).

  If event(i,j) happen, it add 2 to the score.

  So we only sum up the probability of all events and multiply them by 2.

  Then our task become how to calculate the sum of all event(i,j).

  We can see event(i,j) is simpliy \(\prod_{i}^{j}p_x\).

  Then we denote dp(j) as sum of all event(i,j) and i<j.

  so dp(0)=0 and dp(j)=(dp(j-1)+\(p_{j-1}\))\(\times\)\(p_j\)

www.cnblogs.com/shaokele/


AC代码

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n;
double ans;
double p[N],dp[N];
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
		scanf("%lf",&p[i]);
	dp[0]=0;
	for(int i=1;i<=n;i++){
		dp[i]=(dp[i-1]+p[i-1])*p[i];
		ans+=dp[i]*2+p[i];
	}
	printf("%.6lf",ans);
	return 0;
}

未经个人允许,不得转载博客中所有内容,否则后果自负.
posted @ 2018-04-12 16:42  skl_win  阅读(415)  评论(0编辑  收藏  举报
Live2D