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

来源:互联网 发布:定陶知行劳务电话 编辑:程序博客网 时间:2024/05/16 18:13

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 sysimport numpy as npdef 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 resans = 0if N >= 8:    ans += calcu(0, Q) * (N - 7)    N = 7for i in range(1, N + 1):    have = i - 1    ans += calcu(int(P // int(pow(2, have) + 0.1)), Q)print('%.2f'%(ans))



阅读全文
0 0
原创粉丝点击