NC18200. 烟花
描述
输入描述
第一行两个整数
接下来一行个数,第个数表示第个烟花被点燃的概率
输出描述
输出有两行
第一行表示产生不同颜色的期望个数第二行表示产生恰好种颜色的概率以换行符分割
示例1
输入:
3 2 0.5 0.25 0.75
输出:
1.5000 0.4062
说明:
第二问样例解释:pypy3 解法, 执行用时: 429ms, 内存消耗: 204504K, 提交时间: 2023-03-31 13:03:24
n,k = map(int,input().split()) p = list(map(float,input().split())) ans = sum(p) dp = [[0.0] * 210 for _ in range(100010)] dp[0][0] = 1.0 for i in range(n): for j in range(k+1): dp[i+1][j] += dp[i][j] * (1 - p[i]) dp[i+1][j+1] += dp[i][j] * p[i] print("%.4f" % ans) print("%.4f" % dp[n][k])
C++(g++ 7.5.0) 解法, 执行用时: 53ms, 内存消耗: 524K, 提交时间: 2023-03-19 11:07:14
#include<iostream> using namespace std; double p,dp[205]; int main(){ int n,k; double sum=0; cin>>n>>k; dp[0]=1; for(int i=1;i<=n;i++){ cin>>p; sum+=p; for(int j=k;j>=0;j--){ dp[j]=dp[j-1]*p+dp[j]*(1-p); } } cout<<sum<<'\n'<<dp[k]; return 0; }
C++(clang++ 11.0.1) 解法, 执行用时: 64ms, 内存消耗: 484K, 提交时间: 2022-10-05 19:33:34
#include<bits/stdc++.h> using namespace std; double f[100005],e,p; int n,k; int main(){ cin>>n>>k; f[0]=1; for(int i=0;i<n;i++){ cin>>p; e+=p; for(int j=k;j>=1;j--)f[j]=f[j]*(1-p)+f[j-1]*p; f[0]*=(1-p); } printf("%.4lf\n%.4lf",e,f[k]); }