列表

详情


NC18200. 烟花

描述

小a有个烟花,每个烟花代表着互不相同的颜色,对于第个烟花,它有的概率点燃,现在小a要去点燃它们,他想知道产生颜色的期望个数 及 产生恰好产生种颜色的概率

输入描述

第一行两个整数
接下来一行个数,第个数表示第个烟花被点燃的概率

输出描述

输出有两行
第一行表示产生不同颜色的期望个数
第二行表示产生恰好种颜色的概率
以换行符分割

示例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]);
}

上一题