您的位置:首页 > 其它

NOIP提高组模拟 幻象

2016-09-04 15:23 176 查看

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)。

代码

#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
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
);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: