微软2017年预科生计划在线编程笔试-#1489 : Legendary Items

本文解析了一道涉及概率和期望计算的编程题,通过分析题意和算法思路,给出了解决方案。针对不同数量的物品,计算了获得特定数量物品所需的期望次数。

http://hihocoder.com/problemset/problem/1489

题意理解:每次获得一个物品之后都会清空初始概率为P/(pow(2, have)), 实际上获得N个东西的过程分别是独立的,并且N》=8之后的初始概率都是0,所以只需要分别算《=7和8的期望次数,这个用高中的期望定义暴力算就好了

急转弯:N》=8的其实和8一样

算法:无

数据结构:无



#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int P, Q, N;

double calcu(int start, int add){
    double res = 0;
    double pre = 1.0;
    int now = start;
    for(int i = 0; ; i++) {
        if(now >= 100) {
            res += pre * 1.0;
            break;
        }
        res += pre * 1.0;
        pre = pre * (1 - now / 100.0);
        now += add;
    }
    return res;
}

int main(){
    scanf("%d%d%d", &P, &Q, &N);
    double ans = 0;
    if(N >= 8) {
        ans = (N - 7) * calcu(0, Q);
        N = 7;
    }
    for(int i = 1; i <= N; i++){
        int have = i - 1;
        ans += calcu(P / (int)(pow(2, have) + 0.1), Q);
    }
    printf("%.2f\n", ans);
    return 0;
}
from __future__ import print_function
#
#

'get familiar with python'

__author__ = 'hjkruclion'

import sys
import numpy as np

def read_int():
    return list(map(int, sys.stdin.readline().split()))

P, Q, N = read_int()

def calcu(start, add):
    res = 0
    now = start
    pre = 1.0
    for i in range(10000):
        if now >= 100:
            res += pre * 1.0
            break
        res += pre
        pre = pre * (1 - now / 100.0)
        now += Q
    return res

ans = 0
if N >= 8:
    ans += calcu(0, Q) * (N - 7)
    N = 7
for i in range(1, N + 1):
    have = i - 1
    ans += calcu(int(P // int(pow(2, have) + 0.1)), Q)
print('%.2f'%(ans))




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值