列表

详情


NC14734. 比赛

描述

你在打比赛,这场比赛总共有12个题

对于第i个题,你的队伍有a[i]的几率解决她

如果解决不了她呢?

由于所有人讨论的都很大声

所以你有b[i]的概率从左边那个队那里听会这个题的做法

有c[i]的概率从右边那个队那里听会这个题的做法

请问最终你们队伍解出0-12题的概率分别是多少

输入描述

第一行12个数表示a[1] -> a[12]
第二行12个数表示b[1] -> b[12]
第三行12个数表示c[1] -> c[12]

输出描述

输出13行,第i行表示解出i-1题的概率
保留6位小数

示例1

输入:

0.20 0.30 0.37 0.40 0.45 0.50 0.57 0.60 0.75 0.76 0.77 0.83
0.85 0.88 0.90 0.94 0.100 0.104 0.105 0.107 0.115 0.120 0.122 0.125
0.128 0.130 0.134 0.140 0.149 0.150 0.152 0.155 0.170 0.183 0.203 0.240

输出:

0.000000
0.000000
0.000000
0.000011
0.000160
0.001508
0.009620
0.041938
0.124153
0.243773
0.301960
0.212453
0.064424

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 612K, 提交时间: 2020-05-18 19:09:56

#include<bits/stdc++.h>
using namespace std;
const int N = 2e3 + 10;
double a[N],b[N],c[N],d[N],dp[N][13];
int main()
{
	for(int i=1;i<=12;++i) cin>>a[i];
	for(int i=1;i<=12;++i) cin>>b[i];
	for(int i=1;i<=12;++i) cin>>c[i];
	for(int i=1;i<=12;++i) d[i]=(1-a[i])*(1-b[i])*(1-c[i]);
	dp[0][0]=1;
	for(int i=1;i<=12;++i)
	for(int j=0;j<=i;++j)
	dp[i][j]=dp[i-1][j]*d[i]+dp[i-1][j-1]*(1-d[i]);
	for(int i=0;i<13;++i)
	printf("%.6lf\n",dp[12][i]);
}

Python3 解法, 执行用时: 70ms, 内存消耗: 4756K, 提交时间: 2022-10-25 14:38:00

n = 12
a = list(map(float, input().split()))
b = list(map(float, input().split()))
c = list(map(float, input().split()))
p = [a[i] + (1.0 - a[i]) * (b[i] + c[i] - b[i] * c[i]) for i in range(n)]
ans = [0.0] * (n + 1)

for i in range(1 << n):
	x, y = 1.0, 0
	for j in range(n):
		if (i & (1 << j)) == 0: x *= (1.0 - p[j])
		else: x *= p[j]; y += 1
	ans[y] += x
for x in ans: print("{:.6f}".format(x))

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 436K, 提交时间: 2023-05-17 21:49:32

#include<bits/stdc++.h>
using namespace std;
double a[12],b[12],c[12],x,d[13];
int i,j;
int main()
{
	for(i=0;i<12;i++)scanf("%lf",a+i);
	for(i=0;i<12;i++)scanf("%lf",b+i);
	for(i=0;i<12;i++)scanf("%lf",c+i);
	for(d[0]=1,i=0;i<12;i++)
	{
		x=(1-a[i])*(1-b[i])*(1-c[i]);
		for(j=i+1;j;j--)d[j]=d[j-1]*(1-x)+d[j]*x;
		d[j]*=x;
	}
	for(i=0;i<13;i++)printf("%.6lf\n",d[i]);
	return 0;
}

上一题