Description
phantom是一位爱思考的哲♂学家。最近phantom得到了森の妖精的真传。在他练功的时候, 每秒他的思绪中都有一定的概率浮现出奇♂异的幻象,持续x秒的幻象将产生x^2的幻象值。phantom练功发自真心,他想知道,在N秒内他期望产生的幻象值是多少。
Data Constraint
对于 40%的数据 N ≤ 10
对于 60%的数据 N ≤ 100
对于 100%的数据,N ≤ 10^6
数据规模较大,请使用效率较高的读入方式。
Solution
对于这种概率题,一看数据范围就知道只能O(N),我们考虑dp。设 L[i]为第 i 秒幻象的持续时间的期望。显然 L[i] = (L[i-1] + 1) * a[i]%。设 f[i]表示前 i 秒的答案,那么 f[i] = f[i-1] + (
(L[i−1]+1)2
–
L[i−1]2
) * a[i]%。我们这样想,对于一次转移,显然f[i-1]是的答案内包含了跳L[i-1]步,而现在你由跳L[i-1]步改为跳L[i-1]+1步,这样的话对于f[i]你必须先减去原来f[i-1]中
L[i−1]2
带来的幻象值,才能加上
(L[i−1]+1)2
的幻象值。程序时间复杂度为 O(N)。
代码
using namespace std;
const int maxn=1000005;
double f[maxn],l[maxn],a[maxn];
int n,i,t,j,k;
double sqr(double x){
return x*x;
}
int main(){
scanf("%d",&n);
for (i=1;i<=n;i++){
scanf("%lf",&a[i]);
l[i]=(l[i-1]+1)*a[i]/100;
f[i]=f[i-1]+(sqr(l[i-1]+1)-sqr(l[i-1]))*a[i]/100;
}
printf("%.1lf",f[n]);
}