37%法则

题目:一个活动,n个女生手里拿着长短不一的玫瑰花,无序的排成一排,一个男生从头走到尾,试图拿更长的玫瑰花,一旦拿了一朵就不能再拿其他的,错过了就不能回头,问最好的策略?
——出自牛客网机器学习/算法工程师面试宝典
官方给出的解答是真的看不懂,没有任何解释,而网上大部分解释都是照搬官方回答或者37%法则的数学推理。
很多人看官方的回答会陷入一个误区,比如这个老哥的评论:

其实官方的解题思路并不是找到最优的那个数字,举个例子:

可以看到这里10是最大的数字,但我们根据这个策略(前3个不选,然后只要见到比8大的就选),选择的数字却是9。

解题思路是这样的:前rrr个女生我是只看不选的,从第r+1个女生开始选。
这种策略并不保证选到最优的结果(10),但是能保证你选到一个还不错的结果,最重要的是,这种策略是可以计算的,可以用数学公式来算。因为你想,这道题给你,你能想到什么策略?只有这一种策略嘛,所以最重要的就是找到这个数,这个rrr是几的时候,概率最大。

接下来就是数学公式了。我们用P(K)P(K)P(K)来表示选到最佳结果的概率,由于rrr是变量,所以这个概率是变化的,我们最后才可以求导取这个概率的最大值。
P(K)=∑i=r+1n1n∗ri−1P(K)=\sum_{i=r+1}^{n}\frac{1}{n}*\frac{r}{i-1}P(K)=i=r+1∑n​n1​∗i−1r​
公式的理解:
首先这个求和符号就是高中学的加法原理,把每一个数字选中的概率都算出来加一起就是最后的结果。为了方便解释,我们就用上面的例子,然后令rrr取3,前3个不取,自然就不用加了,直接从4开始,所以我们选择的结果就是从第4个到第8个数字,每个数字被选中的概率是均等的,所以先来个19\frac{1}{9}91​。
接下来就是核心了,我们用例子中的第六个数字9来说举例,要想选中9,条件就是前5个数字中,最大的数字(8)必须在前三个数字中,否则的话第4个数字来个10,直接就选第4个数字10了,就轮不到9了。这就是为什么要乘ri−1\frac{r}{i-1}i−1r​
i−1i-1i−1意思是前i−1i-1i−1个数字,rrr意思就是看了不选的前r个数字,每个数字的概率相等,那rrr个数字中有最大值的概率自然就是rrr除以总数i−1i-1i−1。

很多人就是把这里找最大值的过程,当做是找最优结果了。谁让官方回答来了一个《拥有最长玫瑰的女生出现在前r-1个女生中》。这种说法是不准确的,应该说《前k-1个女生中,拥有最长玫瑰的女生出现在前r-1个女生中》,这样大家就不会误解了。

理解如何得到P(K)P(K)P(K)之后,下面就是求个导数。(官方回答仍然很让人费解,我是看不懂)
P(K)P(K)P(K)可以这样写
P(K)=1n∑i=r+1nri−1P(K)=\frac{1}{n}\sum_{i=r+1}^{n}\frac{r}{i-1}P(K)=n1​i=r+1∑n​i−1r​
就是把1n\frac{1}{n}n1​放到前面去,只有iii是不能提出来的,其他字母都可以提出来。我们的变量只有一个rrr。
令x=rnx=\frac{r}{n}x=nr​
P(K)P(K)P(K)就可以写为: (如果这一步不懂,可以先跳过,下面有解释,用到了微积分中的求和公式转积分的知识)
P(K)=x∫x11tdt=−xlnxP(K)=x\int_x^1\frac{1}{t}dt=-xlnxP(K)=x∫x1​t1​dt=−xlnx
求导,
P′(K)=−(lnx+1)P^\prime(K)=-(lnx+1)P′(K)=−(lnx+1)
令P′(K)=0P^\prime(K)=0P′(K)=0则
x=1ex=\frac{1}{e}x=e1​
P(K)max=1eP(K)_{max}=\frac{1}{e}P(K)max​=e1​
r=ner=\frac{n}{e}r=en​

求和公式转积分

如何从P(K)=1n∑i=r+1nri−1P(K)=\frac{1}{n}\sum_{i=r+1}^{n}\frac{r}{i-1}P(K)=n1​i=r+1∑n​i−1r​变到P(K)=x∫x11tdt=−xlnxP(K)=x\int_x^1\frac{1}{t}dt=-xlnxP(K)=x∫x1​t1​dt=−xlnx
这里要用到微积分的知识。首先回顾一下积分求和公式:
∫01f(x)dx=lim⁡n→+∞1n∑i=1nf(in)\int_0^1f(x)dx=\lim_{n \to +\infty}\frac{1}{n}\sum_{i=1}^nf(\frac{i}{n})∫01​f(x)dx=n→+∞lim​n1​i=1∑n​f(ni​)
求和公式转成积分,不是特别直观,我们采用的方法是尽量还原成积分求和公式右边的这种形式
我们把P(K)P(K)P(K)公式的下标变换一下:
P(K)=1n∑i=rnriP(K)=\frac{1}{n}\sum_{i=r}^{n}\frac{r}{i}P(K)=n1​i=r∑n​ir​
然后把rrr提出来
P(K)=rn∑i=rn1iP(K)=\frac{r}{n}\sum_{i=r}^{n}\frac{1}{i}P(K)=nr​i=r∑n​i1​
接下来就是凑,往标准公式右边凑,已经有1n\frac{1}{n}n1​了,不用凑了,但我们是1i\frac{1}{i}i1​,别人是in\frac{i}{n}ni​,那可以乘个nnn
再取倒数,就变成了
P(K)=rn∗1n∑i=rn1inP(K)=\frac{r}{n}*\frac{1}{n}\sum^n_{i=r}\frac{1}{\frac{i}{n}}P(K)=nr​∗n1​i=r∑n​ni​1​
我们令x=rnx=\frac{r}{n}x=nr​
直接把in\frac{i}{n}ni​换成变量ttt就行了,上限是当iii取到nnn时,即1,下限是当iii取rrr时,即rn\frac{r}{n}nr​,也就是xxx
所以P(K)=x∫x11tdtP(K)=x\int_x^1\frac{1}{t}dtP(K)=x∫x1​t1​dt

一个活动,n个女生手里拿着长短不一的玫瑰花,无序的排成一排,一个男生从头走到尾,试图拿更长的玫瑰花,一旦拿了一朵就不能再拿其他的,错过了就不能回头,问最好的策略相关推荐

  1. 返回数据给上一个活动

    既然可以传递数据给下一个活动,那么能不能够返回数据给上一个活动呢?答案是肯定的.不过不同的是,返回上一个活动只需要按一下Back键就可以了,并没有一个用于启动活动的Intent来传递数据.通过查阅文档 ...

  2. mysql查找喜欢的女孩_怎样判断一个你喜欢的女生是否喜欢你?

    1.你们偶遇的次数越来越多.当你在意一个人或被一个人在意的时候,你会发现彼此相遇的频率甚至可以从20%提升到80%. 你会在餐厅或者平时常走的路上遇见她,甚至可以随意瞥一眼都能看到她,这不是什么机缘巧 ...

  3. 使用显式Intent向下一个活动传递数据

    在启动活动时传递数据的思路很简单,Intent提供了一系列putExtra()方法的重载,可以把我们想要传递的数据暂存在Intent中,启动了另一个活动后,只需要把这些数据再从Intent中取出取出就 ...

  4. android intent参数是上次的结果,【Android】7.0 Intent向下一个活动传递数据、返回数据给上一个活动...

    1.0 可以利用Intent吧数据传递给上一个活动,新建一个叫"hellotest01"的项目. 新建活动FirstActivity,勾选"Generate Layout ...

  5. 农村大叔开饭店,本来快倒闭了,后来做了一个活动能就买车买房?

    一个初中学历的家常菜餐馆老板,推出一个酸菜鱼免费吃的活动,让原本亏本经营的店生意爆火,每天都顾客盈门,你想知道他是怎么做到的吗? 今天我就给大家详细的分析一下这个案例,和背后的盈利模式,以及教大家具体 ...

  6. ACNO.15猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。 第二天早上又将剩下的桃子吃掉一半,又多吃一个。以后每天早上都吃了前一天剩下的一半零一个。 到第N天早上想再

    题目描述 猴子吃桃问题.猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个.第二天早上又将剩下的桃子吃掉一半,又多吃一个.以后每天早上都吃了前一天剩下的一半零一个.到第N天早上想再吃时,见 ...

  7. Android怎么设置主活动,如何从另一个活动启动Android AppWidget的配置活动?

    这让我发疯了.我开发了一个App-widget.一切都很好. 我有一个配置活动,每次在主屏幕上添加一个小部件并且工作得很漂亮时启动.我保存每个小部件ID的用户设置等. 窗口小部件有一些按钮,其中一个按 ...

  8. android如何导入活动,关于android:如何将活动值传递给另一个活动(Kotlin)

    我是Kotlin的新手,我正在尝试为我的应用进行设置活动,我希望该活动将其价值传递给其他活动. 我尝试了不同的代码,但没有一个起作用,我尝试制作一个共享的首选项文件,但我不知道如何编写代码 要清楚,我 ...

  9. android从一个活动到另一个活动,Android应用程序在将一个活动打开到另一个活动时崩溃...

    我正在开发Android应用程序,在我的应用程序中,我想通过单击UHFMenuActivity中的布局来打开UHFMainActivity,但应用程序正在崩溃.当我使用另一个活动而不是UHFMenuA ...

最新文章

  1. JS 回车提交,兼容IE、火狐、Opera、Chrome、Safari……
  2. awk和cut分割字符区别
  3. 將軍苑 - 收藏集 - 掘金
  4. Linux 列出文件列表命令ls
  5. Educational Codeforces Round 37 G. List Of Integers (二分,容斥定律,数论)
  6. c语言ok未定义标识符,C语言中宏的相关知识 - osc_y7ckpzr9的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. [转]Reporting Service部署之访问权限
  8. 联合索引会创建几个索引_【1033期】分别谈谈联合索引生效和失效的条件
  9. Linux设置时间和硬件时间
  10. 使用 ffmpeg 进行视频(ts)合并
  11. 获取微信小程序码的“47001”错误码的坑,errmsg:data format error hint
  12. 测试硬盘或者存储设备的小巧工具-CrystalDiskMark提供下载
  13. unity WebGL射线检测
  14. 第16届东北四省赛题解
  15. Python_pandas读取数据
  16. 视频损坏解决办法(个人记录)
  17. #ifndef #defin #endif的用法
  18. 2022年最新NFT 开发平台解决方案
  19. 从neo4j-broswer中剥离graph图表
  20. 我画你猜(微信版--游戏说明)

热门文章

  1. 零基础的新手如何快速搭建一个网站
  2. android 手势旋转,Android检测旋转手势
  3. Primitive Topology
  4. 搜狗笔试题~求圆上的点最多可以组成多少个钝角三角形
  5. mac 下 qq截图突然不能用了
  6. 打工人必学的法律知识(一)——《中华人民共和国劳动合同法》必知必会
  7. 什么是欧式期权与美式期权?
  8. 暗黑2重置版2 采访记录(二)
  9. 在pfSense中使用Backup插件备份文件和目录
  10. Leetcode778-水位上升的泳池中游泳