吃豆子过桥问题

百度校招面试经历及总结(已发offer) 听说发面经可以攒rp,希望早点给我确定的offer通知,也希望看到这个面经的小伙伴能顺利拿到心仪的offer~ 职位:机器学习-数据挖掘工程师 9.15 上午11点 一面 1.介绍项目 2.考研意向,是否确定要工作不考研 3.写代码:在二叉树结点结构中加一个指针域,使其指向层次遍历的下一个结点,特别地,每一层的最后一个结点为空 4.写代码:实现一个简单的单例模式,在多线程环境下呢? 阅读详情

本题来自于百度校招面试题,通过一个简单的智力问题理解递归问题的解法。

  一:问题描述

  一个人要过一座80米的桥,每走一米需要吃一颗豆子,他最多可以装60颗豆子,问最少需要吃多少颗豆子才能走完桥?

 

  二:初步分析

  1.一趟(不折回)最多只能走60米豆子就会被吃完;

  2.如果有折回,必须保证能够返回到有豆子的地点,且在折回点放下的豆子尽量多;

  3.尽可能少的折回(次数和折回的距离都要少,毕竟一趟折回就要多消耗一个来回的豆子);

  4.折回点的豆子数量要求至少能够走完剩余的部分;

 

  三:具体分析

  1.由条件1得一趟走不完,由条件3我们可以考虑折回尽量少的次数能否走完。

  先考虑只折回一次,那么此时就要求得折回点的位置。

  2.由条件3得折回的距离尽量短,那么可以考虑最短的折回距离,很明显应该是20米处;设折回点距离起始位置x米,则此时x=20;那么在x处,需要至少有60颗豆子,一次性拿60颗豆子走完最后一程。

  那么问题就来了,怎么在x处囤积60颗豆子呢,假使他第一次信心满满的拿着60颗豆子,走到x处就只剩下40颗了,现在不够走完剩余的全程啊,只能放下一部分折回去再取了,那放多少呢,很明显由条件2得我们需要放下20颗,拿着20颗刚好可以折回到起点,继续拿着60颗豆子第二次来到x处,此时手上还有40颗,再捡起第一次放的20颗,共60颗豆子刚好可以走完全程。

  在这种情况下,我们易知,他共走了(20)*3+(60)= 120米,故吃掉120颗豆子。

 

  四:问题拓展

  如果桥长81米呢?

  此时我们如果还是只折回一次的话,在21米处还是得有60颗豆子,也就是需要搬运60颗豆子到21米处;分析得不可能只折回一次就搬运60颗豆子到21米处,因此需要再设置一个折返点y,此时x=21,0<y<x;

  刚才考虑了80米的情况,那么我们可以假设现在在80米的基础上加了1米,因此可以设y=1,即先折回两趟到1米处,这样y处就有60*3-5*(1)=175颗豆子,再从y到x折返1趟,x处就有60*2-3*(20)=60颗豆子,最后从x出发拿着60颗豆子就可以愉快的走过桥了。

  因此他共走过5*(1)+3*(20)+(60) = 125米,故吃掉125颗豆子。

 

  五:再次拓展

  如果桥长n米,最多装m颗豆子,最少消耗f(n,m)与n和m的关系是什么呢?

  此时问题突然就变得很复杂了,别急,我们分析一下刚才的思路,桥长从80米到81米,就是要在1米处放足够多豆子(当然只要不小于桥长80米时的消耗就行),那么这些豆子又需要从起点处运到1米处,那么在这1米内又需要消耗多少豆子呢?

  我们可以考虑先把可装的最大豆子数m固定(假设还是60),当桥长0<n<=60米时,f(n,m) = n;

  当n=61时,需要在1米处囤积f(n-1,6)即f(60,60)=60颗豆子,囤积过程中需要往返一次,第一次到达1米处留下58颗豆子赶紧回去再取60颗到达1米处还剩59颗,现在有117颗足够走完最后60米。消耗豆子1*2+(1)+60 = 63颗豆子;

  当n=62时,需要在1米处囤积f(n-1,m)即f(61,60)=63颗豆子,囤积过程中需要往返一次,第一次到达1米处留下58颗豆子赶紧回去再取60颗到达1米处还剩59颗,现在有117颗足够走完最后61米。消耗豆子1*2+(1)+63 = 66颗豆子;

  以此类推...

  那么问题来了,细心的你肯定发现了上面那种情况都是往返一次的,但是不是每次都只往返一次,比如当n=81时,该怎么确定往返的次数呢?

  分析上面的递推关系我们可以知道,每次往返的趟数与f(n-1,m)的大小有关。分析往返过程易知:最后一次到达1米处剩59颗豆子,之前每次到达1米处可以放下58颗豆子,假设之前到达了1米处T次,则有:

  59 + 58 * T >= f(n-1,60)  ==>  T >= [f(n-1,60)-59]/58

  由于T必须是整数,故T = ceil((f(n-1,60)-59) / 58),ceil(x)表示对x向上取整,即不小于x的最小整数

  另一种表示方式为T = (f(n-1,60)-2) / 58

  之前往返T次消耗掉2T颗豆子,最后一次到达1米处消耗1颗豆子,故总消耗:f(n-1,60) + 2T + 1颗豆子

  这时候我们考虑将固定为60的m扩展为任意m,则有:f(n,m) = f(n-1,m) + ceil( f(n-1,m)-(m-1)) / (m-2) ) * 2+ 1 = f(n-1,m) + (f(n-1,m)-2) / (m-2) * 2+ 1 ;

  好了到这里,这个问题也彻底解决完了,现在就让我们用简短的代码来实现这个过程吧!

 

  六:编程实现   

复制代码
 1 #include<cmath>
 2 #include<iostream>
 3 using namespace std;
 4 typedef unsigned long long int64;
 5 
 6 //参数说明:length为桥的长度,maxNum为最大可带的豆子数
 7 //递归实现
 8 int64 getMinConsume(int length, int maxNum) {
 9     if(length <= maxNum)
10         return length;
11     int64 get_n_1 = getMinConsume(length-1,maxNum);    //上一次的豆子消耗
12     return get_n_1 + (get_n_1-2)/(maxNum-2) * 2 + 1;
13 }
14 //第二种公式实现——递归
15 int64 getMinConsume2(int length, int maxNum) {
16     if(length <= maxNum)
17         return length;
18     int64 get_n_1 = getMinConsume2(length-1,maxNum);//上一次的豆子消耗
19     return get_n_1 + ceil((double)(get_n_1-maxNum+1)/(maxNum-2)) * 2 + 1;
20 }
21 //非递归的实现方式
22 int64 getMinConsume_NoRecursive(int length, int maxNum) {
23     if(length <= maxNum)
24         return length;
25     int64 result = maxNum, i;
26     for(i=maxNum; i<length; i++)
27         result += (result-2)/(maxNum-2) * 2 + 1;
28     return result;
29 }
30 
31 int main()
32 {
33     int maxNum=60, length;
34     for(length=50; length<201; length++)
35         cout<<length<<"米至少消耗"<<getMinConsume2(length,maxNum)<<"颗豆子!"<<endl;
36     return 0;
37 }
38 
39 int main2()
40 {
41     while(1){
42         cout<<"请输入最大可带的豆子数量和桥的长度: ";
43         int maxNum, length;
44         if(!(cin>>maxNum>>length))
45             break;
46         cout<<"至少消耗"<<getMinConsume_NoRecursive(length,maxNum)<<"颗豆子!"<<endl;
47     }
48     return 0;
49 }
复制代码
牛客网面试——数学类型 答案:我的思路如下:首先这应该是多轮问题。(1)初筛:36辆车分6组,每组6辆。这样,比下来,共需要6次。(2)再筛:在初筛中,最坏情况下,有一组的前三名就是36辆车的前三名。因此,每个组都需要保留前三名(后三名就可以踢出去了。)第一名的6辆车放在一起,跑一遍。取前三名。这样,第四五六组都可以被排除了。这样共需要比赛1次。可以筛选出第一组的1-3名,第二组的1-2名,第三组的1名。(3)总决赛:把再筛得到的6辆车放在一起,比一次,即可取出前三名。因此,共需6+1+1=8次。 阅读详情

相关推荐

经典75道智力题答案

是前面75道面试智力题的答案,分析的很清楚。

《吃豆子过桥问题》——经典智力题、面试题

吃豆子过桥问题   本题来自于百度校招面试题,通过一个简单的智力问题理解递归问题的解法。   一:问题描述   一个人要过一座80米的桥,每走一米需要吃一颗豆子,他最多可以装60颗豆子,问最少需要吃多少颗豆子才能走完桥?   二:初步分析   1.一趟(不折回)最多只能走60米豆子就会被吃完;   2.如果有折回,必须保证能够返回到有豆子的地点,且在折回点放下的豆子尽量多;  ...

weixin_30266885的博客 630

经典面试75道智力题

囊括了很多公司的面试题,跟生活息息相关,能让你很好的通过面试。

吃豆子过桥

flyfish 2015-10-15 一个人要过一座 80 米的桥,每走一米需要吃一颗豆子,他最多可以装 60 颗豆子,问最少需要吃多少颗豆子才能走完桥? 设 桥长:长度 L 最多装多少颗豆子 容量 C分析 情况1:L <= C 一次就可以情况2:原长度是L,从L=C开始 ,在原来基础上长度每次加1,加到L=80原题L=80,C=60,L=L+1 消耗 1*2+1+C L=L+2

二分掌柜的 3627

Vivado 2023.1及更早版本永久License全功能解锁:HLS、System Generator等IP核使用详解

本文深入解析Vivado 2023.1及更早版本的全功能许可证,详细指导如何解锁HLS、System Generator等高级IP核。通过许可证类型对比、功能验证方法和实战应用指南,帮助FPGA开发者充分利用Vivado工具套件,提升复杂系统设计和算法加速的效率。

weixin_31286719的博客 376

从Peer到脉冲地震波:免费Python工具全流程配置教程(PyCharm+Anaconda)

本文详细介绍了如何使用Python工具链(PyCharm+Anaconda)实现从Peer数据库获取地震波数据到生成脉冲地震波的全流程配置。通过开源工具EQTOOL和PySeismicGen,结合Python环境搭建、数据格式转换和脉冲地震动生成技术,为结构抗震分析提供高效、灵活的解决方案。

weixin_29093169的博客 430

智力题汇总

100张牌,每次只能抽一张,抽过的牌会丢掉,怎么选出最大的牌。 36匹马,6条跑道,选出最快3匹,最少赛多少场? 5个海盗抢到了100颗宝石,每一颗都一样的大小和价值连城。他们决定:抽签决定自己的号码(1,2,3,4,5)。首先,由1号提出分配方案(你抽到1号),然后大家5人进行表决,当且仅当超过半数的人同意时,按照他的提案进行分配,否则将被扔入大海喂鲨鱼。 如果1号死后,再由2号提出分配方案,依此类推。条件:每颗宝石都是一样的价值。海盗都想保命,尽量多得宝石,尽量多杀人。问题:你会提出怎样的分配方案才

小麦China的博客 712

保姆级教程:从AD导出Gerber到HFSS 3D Layout导入,搞定PCB电磁仿真全流程

本文提供从Altium Designer导出Gerber文件到Ansys HFSS 3D Layout导入的完整PCB电磁仿真流程指南。详细讲解Gerber文件导出设置、HFSS中的3D模型重建技巧,以及电磁仿真中的常见问题解决方案,帮助工程师高效完成高速电路和射频设计的性能验证。

weixin_30379531的博客 705

前端笔试+面试分享

以下是个人线下面试遇到的真实的题,仅供参考和学习。

weixin_48137421的博客 813

手把手教你用HiNet实现图像隐藏:可逆神经网络实战指南(附代码)

本文提供了一份基于HiNet框架实现图像隐藏的实战指南。通过详细解析可逆神经网络原理,手把手指导环境搭建、模型构建、损失函数设计及训练流程,并附有完整代码。该方法利用单个可逆网络统一隐藏与恢复过程,结合小波变换提升隐蔽性,为信息隐藏应用提供了高效解决方案。

rgv234567的博客 433

RK3588开发板量产前必做:24小时DDR压力测试到底在测什么?(附ArmSoM-W3测试脚本解析)

本文深入解析RK3588开发板量产前的24小时DDR压力测试,揭示其核心价值与技术原理。通过memtester、stressapptest和变频测试的组合使用,全面验证DDR内存稳定性。特别介绍ArmSoM-W3测试脚本的创新设计,包括并行测试架构和异常熔断机制,为开发者提供可靠的量产测试方案。

weixin_30325487的博客 453

过桥问题

一、 A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1,2,5,10分钟,只有一只手电,并且同时最多俩人一起过桥。请问,如何安排,能够在17分钟内这四个人全部过桥? 答: (1)A.B一起过桥,花费2分钟。 CD----------AB (2)A带着手电筒返回,花费1分钟。 ACD----------B (3)C.D一起过桥,花费10分钟。A----------BC...

qq_43632625的博客 1234

CentOS 7.9安装python3.11

CentOS 7.9安装python3.11

leafseelight的专栏 1342

吃豆子过桥问题(转)

转载博客:http://www.cnblogs.com/webary/p/4827688.html 吃豆子过桥问题   本题来自于百度校招面试题,通过一个简单的智力问题理解递归问题的解法。   一:问题描述   一个人要过一座80米的桥,每走一米需要吃一颗豆子,他最多可以装60颗豆子,问最少需要吃多少颗豆子才能走完桥?   二:初步分析   1.一趟(不折回)最多只能走60米豆子...

weixin_30505751的博客 384

AI驱动芯片设计的端到端验证:AI应用架构师的全流程指南

想象你要建造一座1000层的超级摩天大楼,每个房间都有独特的功能,管道、电路、电梯系统交织如迷宫。传统的检查方式是派1000个工程师逐层逐房手动检查,耗时十年且仍可能遗漏火灾隐患。这就是今天芯片设计面临的困境:7nm芯片含百亿晶体管,相当于百亿个"房间",传统验证方法(人工编写测试用例、随机仿真)已难以应对。本文的目的,是为AI应用架构师提供一份"AI驱动芯片验证导航图",范围涵盖从验证需求分析到芯片签核的全流程,包括AI模型如何融入传统验证工具链、数据如何驱动验证效率提升、以及端到端闭环系统的构建方法。

2501_92132293的博客 1240

Python爬虫实战:利用最新技术爬取微信公众号文章(基于搜狗搜索)

使用最新Python版本确保兼容性和性能:比传统Requests更强大的HTML解析库Playwright:新一代浏览器自动化工具,比Selenium更高效Asyncio:异步IO框架提升爬虫效率Redis:分布式任务队列和去重MongoDB:非关系型数据库存储结构化数据本文详细介绍了如何利用Python最新技术栈构建一个功能强大的微信公众号文章爬虫。通过结合Playwright浏览器自动化、异步IO、分布式任务队列等技术,我们实现了一个能够绕过反爬机制、高效稳定抓取数据的解决方案。

2201_76125261的博客 1794

Python 巨人吃豆

代码题: 有一个巨人,每走一米需要吃一颗豆子,身上最多带m颗豆子,桥长n米,桥这边有无数颗豆子,问巨人过桥最少要吃多少颗豆子。(巨人可以在桥上放豆子折返) 1、m=60,n=80 最少需要多少颗;如何证明是最少 2、m=60, n=81 最少需要多少颗 3、写代码实现 f(m,n) 要求1个小时内返回结果,给出 分析、思路和代码。 # coding=utf-8 def f(tempM,tempN): count = 0 # [minN,maxN] minN = 0 m

weixin_43332500的博客 605

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

热门智力题 过桥问题和倒水问题

热门智力题 过桥问题和倒水问题 过桥问题和倒水问题都是笔试面试中的热门智力题,不但微软、GOOGLE、百度、腾讯等公司采用,甚至在IQ测试与公务员考试中都能见到。本文不但教你如何快速用手算来解决这两种问题,并且教你如何用程序代码来计算这两种问题。绝对让你大有收获。 一.过桥问题 在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸

铭霏的记事本 502

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

趣味智力题:过桥

问题描述: 现在小明一家过一座桥,过桥时候是黑夜,所以必须有灯。现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要8秒,小明的爷爷要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且灯在点燃后30秒就会熄灭。问小明一家如何过桥?   过桥过程

风云的专栏 1039

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

麦草、煤块和豆子

一座村子里住着一位贫穷的老太太,她摘了一盘豆子,准备煮熟了吃。她在炉子里点上火,为了让炉子烧得快一点,她生炉子的时候用了一把麦草。当把豆子倒进锅里时,她没有注意到一粒豆子掉了出来,落在地上的一根麦草旁。不一会儿,一块燃烧的煤炭也从炉子中跳了出来,落在它俩的旁边。于是,麦草开口说:"亲爱的朋友们,你们从哪里来呀?"煤块答道:"我总算幸运地从火里跳出来了。要是我没...

weixin_33862993的博客 151

ACM_总论_杂文_测试你的智力有多高

第一部分:100道测试你的智力的题目1:你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你的工人付费? 2:现在小明一家过一座桥,过桥时候是黑夜,所以必须有灯。现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要8秒,小明的爷爷要12秒。每次此桥最多可过两人,而过桥的速度依过桥最慢者而定,而且

技术札记 4236

10个经典智力推理题!据说答对7道,智力在140!

点击“蓝字”关注我们 全文字数: 1500 阅读时间: 5 分钟 1.趣味推理:找出两处破绽 追捕已久的头目突然被发现在一个雨天莫名其妙地触电而死。现场情况如下:死者倒在郊外一座工厂后的泥地上,面部无明显损伤,身穿普通的工作服,泥迹斑斑,脚蹬一 双新皮鞋,鞋底的花纹清晰可辨。死者仰面朝天,手心向...

AlbertYang的博客 1万+

用友对应的java版本_用友Java面試(2017)

用友Java面試(2017)一、筆試部分1.題目是這樣的:老大 老二 老三 每個人有10顆豆 有一個圖表示他們之間的喜愛關系,他們每次都是將自己的豆都平分給自己喜愛的人 問這個游戲什么時候能夠結束?並用一門程序語言描述。(他們之間的喜愛關系有圖像表示 這里描述一下 老大喜愛老二和老三, 老三喜歡老二 ,老二喜歡老大 )解決方案:首先想的是什么時候結束?如何才能結束?老大老三老二形成了資源循環,...

weixin_29439509的博客 311

用友Java面试(2017)

用友Java面试(2017) 一、笔试部分 1.题目是这样的:老大 老二 老三 每个人有10颗豆  有一个图表示他们之间的喜爱关系,他们每次都是将自己的豆都平分给自己喜爱的人 问这个游戏什么时候能够结束?并用一门程序语言描述。(他们之间的喜爱关系有图像表示 这里描述一下  老大喜爱老二和老三, 老三喜欢老二 ,老二喜欢老大 ) 解决方案:首先想的是什么时候结束?如何才能结束?老大老三老二形成

u010307827的专栏 6090
上一篇: 将字符串转换为数字
下一篇: DataRow 转 泛型
make1828
博客等级 码龄19年 60粉丝 105原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值