zoukankan      html  css  js  c++  java
  • 【转载】hihocoder 笔试题 Lengendary Items

    https://github.com/hiho-coder/msft-2017-online-test-solution/blob/master/README.md

    【题目】Legendary Items(传说物品)

    Description

    Little Hi is playing a video game. Each time he accomplishes a quest in the game, Little Hi has a chance to get a legendary item.

    At the beginning the probability is P%. Each time Little Hi accomplishes a quest without getting a legendary item, the probability will go up Q%. Since the probability is getting higher he will get a legendary item eventually.

    After getting a legendary item the probability will be reset to ⌊P/(2^I)⌋% (⌊x⌋ represents the largest integer no more than x) where I is the number of legendary items he already has. The probability will also go up Q% each time Little Hi accomplishes a quest until he gets another legendary item.

    Now Little Hi wants to know the expected number of quests he has to accomplish to get N legendary items.

    Assume P = 50, Q = 75 and N = 2, as the below figure shows the expected number of quests is

    2*50%*25% + 3*50%*75%*100% + 3*50%*100%*25% + 4*50%*100%*75%*100% = 3.25

    Input

    The first line contains three integers P, Q and N.

    1<=N<=10^6, 0<=P<=100, 1<=Q<=100

    Output

    Output the expected number of quests rounded to 2 decimal places.

    Sample Input

    50 75 2

    Sample Output

    3.25

     

    《Legendary Items》题解

    我们正处于人工智能、机器学习炽热爆发的时代,可以预见很多同学将来都会投身在相关领域。概率论是这些技术背后最重要的数学基础之一。出题人设计这道题目旨在考察同学们对一些基本概念,例如独立事件、期望的理解。

    拿到这题第一个想法可能就是按照题目中的二叉树来求解期望任务数。这张图其实既是出题人的一个陷阱也是一个提示。它虽然直接告诉了我们一种正确的算法求解期望任务数,但是这个算法时间复杂度非常高。分析可知这棵二叉树中的节点数量是指数级O(c^N)的。这样的算法只能得到30分左右。

    提示也隐藏在这张图中,我们仔细观察可以发现红圈中的子树和黄圈中的子树一模一样。

    这提示我们,无论第一件传说物品是怎么获得的(完成第一件任务就获得还是完成两件任务后获得),第二件传说物品都是从25%概率开始,与第一件无关。换句话说,每件传说物品的获得都是独立的,就好像掷N枚骰子每枚骰子的点数是相互独立的一样。

    我们知道如果X和Y是两个独立的随机变量,那么E(X+Y)=E(X)+E(Y)。于是我们可以分别求出获得第一件、第二件……第N件传说物品的期望任务数,再把它们加起来就是最终答案。

    我们知道第i件传说物品起始的概率是⌊P/(2i-1)⌋%,为了描述方便把它记作Pi;任务失败后概率增加Q%。用二叉树表示大概是这样:

    由于概率不断增加Q%,我们最多完成100个任务就一定能获得第i件传说物品。所以计算第i件传说物品的期望任务数的复杂度是O(100)。一般我们在计算复杂度时是忽略常数的,不过这里100次计算是一个比较大的常数,为了体现这一点我们姑且把这个复杂度记作O(100)。这样计算N件传说物品的总复杂度就是O(100N)的。这个算法已经相当不错了,大概能得到90/100分。

    如果我们进一步分析,会发现虽然我们计算了N棵二叉树对应的期望任务数。但这N棵二叉树总共最多有101种形态。因为Q不变,Pi的值唯一决定了这棵二叉树长什么样子,而Pi一共有0~100共101种取值。所以我们只需预先求出起始概率分别是100%、99%、98% … 0%时的期望任务数,保存在数组f[]里。计算第i件传说物品时,根据Pi直接把相应的f[Pi]累加即可。

    值得一提的是,我们可以用倒推的方法求出f[],而不用每次O(100)重新计算。

    f[100] = 1;
    for(int i = 99; i >= 0; i--) {
        int j = min(i + Q, 100);  //计算如果这次任务没获得,下一个任务获得的概率
        //i%的概率1次获得,(1-i%)的概率是从j%起始的期望任务数+1
        f[i] = i% * 1 + (1-i%) * (f[j] + 1);
    }

    于是我们得到了一个O(100+N)的算法,比之前的O(100N)好了100倍。

    如果我们再进一步分析,我们会发现⌊P/(2i-1)⌋%会很快下降到0。实际上从第8件传说物品开始,起始概率就一定都是0了。也就是说从第8件开始我们可以直接用f[0]*(N-7)算出期望任务数的和。这样我们得到了一个更快的O(100+8)的算法。这个算法对于每组数据只需要常数次计算即可得到答案。

    这道题目很典型,可以从一开始复杂度非常高的O(c^N)的算法一路优化到只需要常数次计算的O(1)算法。笔试中很多同学卡了在这道题目上,于是我们单独拿出这题来详细分析。

  • 相关阅读:
    Asp.Net MVC 实现将Easy-UI展示数据下载为Excel 文件
    Asp.Net MVC 文件管理Demo(文件展示,上传,下载,压缩,文件重命名等)
    摄影测量-后方交会与前方交会,相对定向与绝对定向,光束法
    读取超大Excel(39万行数据)
    js 数组 remove
    VM不能连入局域网
    EPANET中读取INPUT文件的函数文件——INPUT3.C
    EPANET中读取INPUT文件的函数文件——INPUT1.C/INPUT2.C/INPUT3.C
    EPANET源码中用到的几个简单C语言函数介绍三
    EPANET中的哈希文件——hash.c
  • 原文地址:https://www.cnblogs.com/wangzming/p/7238672.html
Copyright © 2011-2022 走看看