链接:https://www.nowcoder.com/acm/contest/180/B
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld
题目描述
小a有个烟花,每个烟花代表着互不相同的颜色,对于第个烟花,它有的概率点燃,现在小a要去点燃它们,他想知道产生颜色的期望个数 及 产生恰好产生种颜色的概率
输入描述:
第一行两个整数
接下来一行
个数,第
个数
表示第
个烟花被点燃的概率
输出描述:
输出有两行
第一行表示产生不同颜色的期望个数
第二行表示产生恰好种颜色的概率
以换行符分割
备注:
对于
的数据:
对于
的数据:
即为正确
输出均保留4位小数,若你的答案误差与std不超过
分析:第一问由期望的定义可知期望为E=∑pi ;
第二问,简单概率DP,令dp[i][j]为前i个烟花恰有j个被点燃,
那么dp[i][j]=dp[i-1][j-1] * pi + dp[i-1][j] * (1-pi),其中dp[i-1][j-1] * pi 为第i个被点燃的概率,
dp[i-1][j] * (1-pi)为第i个不被点燃的概率,最后初始化一下即可。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; double p[100100]; double dp[100100][300]; int main() { int n,k; scanf("%d%d",&n,&k); double E=0; for(int i=1;i<=n;i++) { scanf("%lf",&p[i]); E+=p[i]; } dp[0][0]=1; for(int i=1;i<=n;i++) dp[i][0]=(1-p[i])*dp[i-1][0];//初始化 for(int i=1;i<=n;i++) for(int j=1;j<=k;j++) dp[i][j]=dp[i-1][j-1]*p[i]+(1-p[i])*dp[i-1][j]; printf("%.4lf %.4lf ",E,dp[n][k]); return 0; }