首页 > 试题广场 >

抽奖

[编程题]抽奖
  • 热度指数:1296 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解

小A在玩一个网络游戏。这个游戏有个抽装备环节。装备池总共有n+m件装备,分别为n件普通装备和m件ssr装备。抽一次装备的费用按你抽中的装备决定。

抽中每一件装备的概率都为1/(n+m)。如果你抽中了ssr装备。这次的抽装备费用为2金币,否则这次的费用为1金币。如果你抽中了ssr装备,得到奖励,并且装备不会放回。如果你抽中了普通装备。得到奖励,但是这件装备会放回装备池。现在小A希望抽中所有的ssr装备,请你计算一下:需要花费金币的期望值。


输入描述:
输入一行:n,m(1<=n,m<=106)


输出描述:
抽中所有的ssr装备,需要花费金币的期望值。输出保留2位有效小数。
示例1

输入

2 1

输出

4.00
示例2

输入

2 2

输出

7.00
示例3

输入

5 6

输出

24.25
#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
     int m;
    while(cin>>n){
        cin>>m;
        double val=0.00;
        for(int i=1;i<=m;i++){
            val=val+2+(double)n/i;
}
         cout<<fixed<<setprecision(2)<<val<<endl;
    }
   return 0;
    
}

发表于 2022-05-03 20:19:29 回复(2)
def cal_sum(a, b, q, n):
    # 等差乘等比数列的求和公式
    A = a/(q-1)
    B = (b-A)/(q-1)
    return (A*n+B)*q**(n)-B

def getCost(m, n):
    # 剩余m件ssr,n件普通装备,第i次抽取一件ssr的期望为 E(i) = p2*(i+1)*p1^(i-1)
    p1 = n/(m+n)
    p2 = m/(m+n)
    res = cal_sum(p2, p2, p1, 1000000000)
    return res

line = input().split()
n, m = int(line[0]), int(line[1])
res = 0
for i in range(m, 0, -1):
    res += getCost(i, n)
print("%.2f" % res)

编辑于 2022-04-14 10:18:51 回复(0)
五行代码搞定:
import sys

n, m = map(int, input().split())
result = 0

for i in range(m):
result += (m + n - i) / (m-i)
print(f'{(result + m):.2f}')

编辑于 2024-03-30 07:38:54 回复(0)
import java.text.DecimalFormat;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int ssr = in.nextInt();
        DecimalFormat df = new DecimalFormat("#.00");
        System.out.println(df.format(sumCost(n, ssr)));
    }

    public static double sumCost(int n, int ssr) {
        double sum = 0;
        for(int i = ssr; i > 0; i--) {
            sum += getOneCost(n, i);
        }

        return sum;
    }

    public static double getOneCost(int n, int ssr) {
        // 抽取到1次ssr的总次数
        double times = (double)(n + ssr) / ssr;
        // 抽到n的次数
        double nTimes = times - 1;
        // 花费n的次数*n的价格+1*ssr的价格
        double cost = nTimes * 1 + 1 * 2;
        return cost;
    }
}

编辑于 2023-07-06 17:21:32 回复(0)
#include<iostream>
#include<vector>
#include <iomanip>
usingnamespacestd;
 
intmain(){
    intn, m;
    while(cin>>n){
        cin>>m;
        doubleval = 0.00;
        for(inti = 1; i <= m; ++i){
            val = val + 2 + (double)n/i;
        }
        cout<<fixed<<setprecision(2)<<val<<endl;
    }
}
发表于 2022-04-15 17:42:47 回复(0)
n,m=map(int,input().split(' '))
res=0
for i in range(m,0,-1):
    res+=(n+2*i)/i

print(f"{res:.2f}")
直观理解。不一定准确,但确实是这样的结果。只需分别求单次抽取所需金币的期望,以及此状态下抽取ssr装备次数的期望。次数期望*金币期望就是此时装备池抽到一个ssr装备所需的金币,然后依次减少一个ssr装备重复上述过程。
假设当前装备池有n个普通装备,i个ssr装备。单次抽取所需金币期望=1n/(n+i)+2i/(n+i)=(n+2i)/(n+i)。爆ssr装备所需次数期望为单次抽到ssr装备概率的倒数,即为(n+i)/i。二者相乘,此装备池状态下抽到一个ssr装备所需金币=(n+2i)/i=2+n/i.
编辑于 2024-04-03 21:10:44 回复(0)
这个就是简单的数学问题,记得用double
#include <iostream>
using namespace std;

double GetSum(int n, int m){
    double sum=0;
    for(int i=1;i<m+1;i++){
        sum+=(double)1/i;
    }
    return 2*m+n*sum;
}

int main() {
    int n,m;
    cin>>n>>m;
    printf("%.2f",GetSum(n, m));
    return 0;
}

发表于 2023-09-24 13:47:19 回复(0)
import sys

s = input()
n, m = s.split()
n = int(n)
m = int(m)
out = 0
for i in range(m):
    p0 = n/(n+m-i)
    out = out + (1 + (1 / (1-p0)))
print("%.2f"%out)
发表于 2023-09-15 17:20:18 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        double ans = 0;
        while (m > 0) {
            double p = (double)m/(m+n);
            ans += e(p);
            m--;
        }
        System.out.printf("%.2f",ans);
        
    }
    private static double e(double p) {
        return (1+p)/p;
    }
}
发表于 2023-08-14 17:16:14 回复(0)
    m = int(a[1])
    n = int(a[0])
    val = 2*m+n*sum([1/j for j in range(1, m+1)])
    print("%.2f"%val)

发表于 2023-03-22 21:39:41 回复(0)
function sum(n, m) {
    let res = 0;
    while (m > 0) {
        res += n / m;
        m--;
    }
    res += m * 2;
    return res;
}
发表于 2022-08-08 17:49:40 回复(1)

问题信息

上传者:小小
难度:
11条回答 3851浏览

热门推荐

通过挑战的用户

抽奖