题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4318
4318: OSU!
Time Limit: 2 Sec Memory Limit: 128 MB
Submit: 374 Solved: 294
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
0.5
0.5
0.5
Sample Output
HINT
Source
考虑每一位对答案的贡献为f[i];则f[i]=p[i]*(3*e1[i-1]+3*e2[i-1]+1),e1[i]表示到i位连续1的期望,e2[i]就是平方的期望。把每一位的贡献加起来就是答案。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 100005
using namespace std;
int n;
typedef double ld;
ld ans,p[maxn],f[maxn],e1[maxn],e2[maxn];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lf",&p[i]);
for(int i=;i<=n;i++){
f[i]=p[i]*(+*e1[i-]+*e2[i-]);
e1[i]=p[i]*(e1[i-]+);e2[i]=p[i]*(e2[i-]+*e1[i-]+);
}
for(int i=;i<=n;i++)ans+=f[i];
printf("%.1lf\n",ans);
return ;
}
题目链接:http://codeforces.com/problemset/problem/235/B
2 seconds
256 megabytes
standard input
standard output
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 22 + 32 + 22 = 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 haspi probability to be "O", 1 - pi to be "X". You task is to calculate the expected score for your play.
The first line contains an integer n (1 ≤ n ≤ 105) — the number of clicks. The second line contains n space-separated real numbersp1, p2, ..., pn (0 ≤ pi ≤ 1).
There will be at most six digits after the decimal point in the given pi.
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.
3
0.5 0.5 0.5
2.750000000000000
4
0.7 0.2 0.1 0.9
2.489200000000000
5
1 1 1 1 1
25.000000000000000
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
其实和上一题一样,就是变成平方了而已。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#define maxn 100005
using namespace std;
int n;
typedef double ld;
ld ans,p[maxn],f[maxn],e1[maxn];
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lf",&p[i]);
for(int i=;i<=n;i++){
f[i]=p[i]*(+*e1[i-]);
e1[i]=p[i]*(e1[i-]+);
}
for(int i=;i<=n;i++)ans+=f[i];
printf("%.12lf\n",ans);
return ;
}