链接:https://www.nowcoder.com/acm/contest/180/B
来源:牛客网
题目描述
小a有个烟花,每个烟花代表着互不相同的颜色,对于第
个烟花,它有
的概率点燃,现在小a要去点燃它们,他想知道产生颜色的期望个数 及 产生恰好产生
种颜色的概率
输入描述:
第一行两个整数 接下来一行个数,第个数表示第个烟花被点燃的概率
输出描述:
输出有两行 第一行表示产生不同颜色的期望个数
第二行表示产生恰好种颜色的概率
以换行符分割
示例1
输入
复制
3 2 0.5 0.25 0.75
输出
复制
1.5000 0.4062
说明
第二问样例解释:
相加得
备注:
对于的数据: 对于的数据: 输出均保留4位小数,若你的答案误差与std不超过即为正确
第一问
由于每个烟花互不相同,因此每种颜色的个数都是$1$
根据期望的定义:$ans = \sum p_i * 1 = \sum p_i$
第二问
设$f[i][j]$表示前$i$个烟花,恰好有$j$个被点燃的概率
转移的时候枚举当前烟花是否被点燃
滚动数组优化
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAXN = 100001;
int N, K;
double p[MAXN], f[2][MAXN];
int main() {
scanf("%d %d", &N, &K);
double sum = 0;
for(int i = 1; i <= N; i++) scanf("%lf", &p[i]), sum += p[i];
printf("%.4lf\n", sum);
int o = 0;
f[o][1] = p[1]; f[o][0] = 1 - p[1];
for(int i = 2; i <= N; i++) {
o ^= 1;
for(int j = 0; j <= min(i, K); j++)
f[o][j] = f[o ^ 1][j - 1] * p[i] + f[o ^ 1][j] * (1 - p[i]);
}
printf("%.4lf", f[o][K]);
return 0;
}