列表

详情


NC54262. GJX赚钱

描述


GJX带着他辛苦攒下的零花钱去参加商业竞赛,每个月都会有一次竞赛,每次竞赛只会有一个获胜者。

包括GJX在内参与竞赛的一共有n个人,最开始的时候,每个人都有初始的金钱。

在第i个月的竞赛中,获胜者会立刻获得金钱v_i,而失败者获得0

GJX发现一个人拥有的钱越多,他赢得每次竞赛的概率就越大。有钱真好。

假设在每次竞赛之前,第i个人当前拥有的钱为,那么第i个人赢得本次竞赛的概率为



假设GJX编号为1,请问m个月后,GJX拥有金钱的数学期望是多少?

输入描述

第一行,两个正整数n和m。

第二行,n个实数,w_1,w_2,...,w_n,表示每个人初始的金钱。

第三行,m个实数,v_1,v_2,...,v_m,表示每个月获胜者可以获得的金钱。

输出描述

一行,一个实数,表示GJX在m个月后能够拥有的钱的数学期望。输出结果保留6位小数。

示例1

输入:

2 2
1 1
1 1

输出:

2.000000

原站题解

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

Python(2.7.3) 解法, 执行用时: 25ms, 内存消耗: 2812K, 提交时间: 2019-10-26 17:01:23

num1 = [int(x) for x in raw_input().split(" ")]
num2 = [float(x) for x in raw_input().split(" ")]
num3 = [float(x) for x in raw_input().split(" ")]


for j in num3:
    sum = 0
    for i in range(num1[0]):
        sum = sum +num2[i-1]
    for i in range(num1[0]):
        P = num2[i-1]/sum
        num2[i-1] = num2[i-1] + P * j

print(format(num2[0],".6f"))

C(clang 3.9) 解法, 执行用时: 4ms, 内存消耗: 360K, 提交时间: 2019-10-26 17:44:03

#include <stdio.h>

int main()
{
	int m, n;
	double sum = 0, first = 0, a;
	scanf("%d%d", &n, &m);
	scanf("%lf", &a);
	first = a;
	sum=a;
	for(int i=1; i<n; i++){
		scanf("%lf", &a);
		sum+=a;
	}
	for(int i=0; i<m; i++){
		scanf("%lf", &a);
		first += a*(first/sum);
		sum+=a;
	}
	printf("%.6lf", first);
    return 0;
}

C++14(g++5.4) 解法, 执行用时: 4ms, 内存消耗: 376K, 提交时间: 2019-10-26 15:36:06

#include<iostream>

using namespace std;

int main()
{
	int n,m;
	cin>>n>>m;
	double w[300],v[300];
	double s=0;
	for (int i=0;i<n;i++)
	{	
		cin>>w[i];
		s+=w[i];
	}
	for (int i=0;i<m;i++)
		cin>>v[i];
	
	for (int i=0;i<m;i++)
	{
		w[0]=w[0]+w[0]/s*v[i];
		s+=v[i];
	}
	
	printf("%0.6f\n",w[0]);
	
	return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 488K, 提交时间: 2019-10-31 21:45:44

#include<bits/stdc++.h>
using namespace std;
const int maxn=305;
int n,m;
double dp[maxn];
int main(){
	scanf("%d %d",&n,&m);
	double tmp=0,sum=0;
	for(int i=1;i<=n;i++){
		cin>>tmp,dp[i]=tmp,sum+=tmp;
	}
	double v;
	for(int i=1;i<=m;i++){
		cin>>v;
		dp[1]+=dp[1]*v/sum;
		sum+=v;
	}
	printf("%.6lf",dp[1]);
}

Python3(3.5.2) 解法, 执行用时: 19ms, 内存消耗: 3352K, 提交时间: 2020-10-05 21:34:02

n, m = map(int, input().split())
w = list(map(float, input().split()))
v = list(map(float, input().split()))

for i in range(m):
    total = sum(w)
    p = list(map(lambda x:x/total, w))
    w = list(map(lambda x, y:y + x*v[i], p, w))

print("{:.6f}".format(w[0]))

上一题