分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

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

过桥问题和倒水问题都是笔试面试中的热门智力题,不但微软、GOOGLE、百度、腾讯等公司采用,甚至在IQ测试与公务员考试中都能见到。本文不但教你如何快速用手算来解决这两种问题,并且教你如何用程序代码来计算这两种问题。绝对让你大有收获。

一.过桥问题

在漆黑的夜里,四位旅行者来到了一座狭窄而且没有护栏的桥边。如果不借助手电筒的话,大家是无论如何也不敢过桥去的。不幸的是,四个人一共只带了一只手电筒,而桥窄得只够让两个人同时通过。如果各自单独过桥的话,四人所需要的时间分别是1,2,5,8分钟;而如果两人同时过桥,所需要的时间就是走得比较慢的那个人单独行动时所需的时间。问题是,你如何设计一个方案,让用的时间最少。

这个题目被微软、GOOGLE、百度、华硕、建设银行等很多公司用作笔试题或面试题。当然也有用在IQ测试中。

解答其实也容易,能者多劳这四个字就足以形容解答方案了——用时短的人必须要多跑几趟以便传递手电筒。

设这四个人叫做A,B,C,D,他们所需要的时间分别是1,2,5,8分钟。

第一步:A和B过桥,花费2分钟。

第二步:A回来,花费1分钟。

第三步:C和D过桥,花费8分钟。

第四步:B回来,花费2分钟。

第五步:A和B过桥,花费2分钟。

这样只要花费2+1+8+2+2=15分钟,下面再来考虑如何用程序来解决这类问题,在写程序之前还有个细节要考虑下,比如A,B,C,D四个人所需要的时间分别是1,8,9,10分钟。

方案一

第一步:A和B过桥,花费8分钟。

第二步:A回来,花费1分钟。

第三步:C和D过桥,花费10分钟。

第四步:B回来,花费8分钟。

第五步:A和B过桥,花费8分钟。

一共要8+1+10+8+8=35分钟。

方案二

第一步:A和B过桥,花费8分钟。

第二步:A回来,花费1分钟。

第三步:A和C过桥,花费9分钟。

第四步:A回来,花费1分钟。

第五步:A和D过桥,花费10分钟。

一共要8+1+9+1+10=29分钟。

因此可以得出更加细化的解决方案——要么是最快者将最慢的2个送过桥,要么是最快的2个将最慢的2个送过桥。即将过桥的人按其过桥的时间从小到大排列,设为A,B,…… Y,Z。其中A和B是最快的二个,Y和Z是最慢的二个。那么就有二种方案:

方案一 最快者将最慢的2个送过桥

第一步:A和Z过桥,花费Z分钟。

第二步:A回来,花费A分钟。

第三步:A和Y过桥,花费Y分钟。

第四步:A回来,花费A分钟。

这四步后总人数就减小2个,花费时间为A + A + Y + Z分钟。

方案二 最快的2个将最慢的2个送过桥

第一步:A和B过桥,花费B分钟。

第二步:A回来,花费A分钟。

第三步:Y和Z过桥,花费Z分钟。

第四步:B回来,花费B分钟。

这四步后总人数同样减小2个,花费时间为A + B + B + Z分钟。

这样,每次比较一下这二种方案就能将总人数减小2。然后我们再考虑一些边界情况:

有三个人过桥设为A,B,C(已经排好序,下同)。应该花费A + B + C分钟。

有二个人过桥设为A,B。那么肯定是花费B分钟。

有一个人过桥设为A。肯定花费A分钟。

分析至此,代码很容易写出,对输入的数据可以用快速排序来排下序(关于qsort的使用,可以参见《使用VC库函数中的快速排序函数》)。

//热门智力题 - 过桥问题#include<iostream.h>#include<stdlib.h>const int MAXN = 1000;int cmp(const void *x,const void *y){ return *(int *)x-*(int *)y;}int main(){ cout<<"热门智力题 - 过桥问题"<<endl; cout<<"  --by MoreWindows( http://blog.csdn.net/MoreWindows )--\n"<<endl;   int n, i, sum, a[MAXN]; cout<<"请输入人数:"; cin>>n; cout<<"请输入每个人过桥时间,以空格分开"<<endl; for (i = 0; i < n; i++)  cin>>a[i]; qsort(a, n, sizeof(a[0]), cmp); sum = 0; for (i = n - 1; i > 2; i = i - 2) {    //最小者将最大2个送走或最小2个将最大2个送走  if (a[0] + a[1] + a[1] + a[i] < a[0] + a[0] + a[i - 1] + a[i])   sum = sum + a[0] + a[1] + a[1] + a[i];  else   sum = sum + a[0] + a[0] + a[i - 1] + a[i];  } if (i == 2)  sum = sum + a[0] + a[1] + a[2]; else if (i == 1)   sum = sum + a[1]; else   sum = a[0]; cout<<"最短过桥时间为:"<<sum<<endl; return 0;}

程序运行结果如下:

二.倒水问题

这个题目的版本非常之多,有微软版的,腾讯版的,新浪版的等等,最常见的是给你一个容量为5升的桶和一个容量为3升的桶,水不限使用,要求精确得到4升水。

解法肯定有很多,可以用宽度优先搜索(BFS),也可以用穷举法。穷举法实现比较方便,其基本思想是用:用小桶容量的倍数对大桶的容量进行取余。比如3升的桶和5升的桶得到4升水可以这样做:

3 % 5 = 3

6 % 5 = 1

9 % 5 = 4

成功得到4升水。(PS:上面的过程用如何用文字描述了?)

同样,用7升的桶和11升的桶得到2升水可以这样做:

7 % 11 = 7

14 % 11 = 3

21 % 11 = 10

28 % 11 = 6

35 % 11 = 2

成功得到2升水。

哈哈,有了这个基本思想在用笔算答案时简直是遇神杀神,遇佛杀佛,又方便又快速!如果要求用程序来实现如何做了?easy,将倒水问题的基本思想用易于编程的话来翻译下——不断用小桶装水倒入大桶,大桶满了立即清空,每次判断下二个桶中水的容量是否等于指定容量。有了这个倒水问题的编程指导方针后代码非常容易写出:

//热门智力题 - 打水问题//基本思想:用小桶容量的倍数对大桶的容量进行取余。//指导方针:不断用小桶装水倒入大桶,大桶满了立即清空,//每次判断下二个桶中水的容量是否等于指定容量。#include<iostream>#include <vector>#include<string>using namespace std;const string OPERATOR_NAME[7] = { "装满A桶","装满B桶", "将A桶清空","将B桶清空", "A桶中水倒入B桶","B桶中水倒入A桶", "成功"};int main(){ cout<<"热门智力题 - 打水问题"<<endl; cout<<"  --by MoreWindows( http://blog.csdn.net/MoreWindows )--\n"<<endl; int    a_volume, b_volume, goal_volume; vector<string> record;       //记录操作步数 int    ai; int    i, a_water, b_water; cout<<"请输入A桶容量,B桶容量,目标容量:"; cin>>a_volume>>b_volume>>goal_volume; a_water = b_water = 0; //A桶,B桶中有多少升水 char szTemp[30]; while (true) {  if (a_water == 0)//A桶没水,就装满水  {   a_water = a_volume;   sprintf(szTemp, "         A:%d  B:%d", a_water, b_water);    record.push_back(OPERATOR_NAME[0] + szTemp);//fill A  }  else  {   //如果A桶的水比(B桶容量-B桶的水)要多   if (a_water > b_volume - b_water)   {    //A桶的水==A桶的水+B桶的水-B桶容量    a_water = a_water + b_water- b_volume;    b_water = b_volume;   //B桶的水装满了    sprintf(szTemp, "  A:%d  B:%d", a_water, b_water);     record.push_back(OPERATOR_NAME[4] + szTemp);//A->B     if (a_water == goal_volume)     break;    b_water = 0;   //将B桶清空    sprintf(szTemp, "       A:%d  B:%d", a_water, b_water);     record.push_back(OPERATOR_NAME[3] + szTemp);   }   else   {    //B桶的水==A桶的水+B桶的水    b_water += a_water;     a_water = 0;    sprintf(szTemp, "  A:%d  B:%d", a_water, b_water);    record.push_back(OPERATOR_NAME[4] + szTemp);//A->B    if (b_water == goal_volume)      break;   }  } } record.push_back(OPERATOR_NAME[6]); //success cout<<"\n---------------------------------------------------"<<endl; cout<<"一个可行的倒水方案如下"<<endl; vector<string>::iterator pos; for (pos = record.begin(); pos != record.end(); pos++)  cout<<*pos<<endl; cout<<"---------------------------------------------------"<<endl; return 0;}

程序运行结果如下:

注意这里只是给出一个可行的倒水方案,不一定是最优解。另外倒水问题要注意下像用2升的桶和4升的桶得到3升水这种不可解的情况,这种不可解情况在用本文中对倒水问题所总结的基本思想计算时会得到循环数列。其根本原因是二个桶容量的最大公约数无法被目标容量所整除,如6升的桶和9升的桶无法得到2升水是因为6和9的最大公约数是3即GCD(6,9)=3而3无法整除2。

倒水问题也也容易推广到多个桶的情况,分析方法和上文差不多,这里就不再赘述了。

过桥问题和倒水问题就讲解到此,相信以后这二类问题都不会再困扰大家了^_^。

转载请标明出处,原文地址:http://blog.csdn.net/morewindows/article/details/7481851

如果觉得本文对您有帮助,请点击‘顶’支持一下,您的支持是我写作最大的动力,谢谢。

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

你好! 这是你第一次使用 **Markdown编辑器** 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片:

带尺寸的图片:

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block var foo = 'bar'; 

生成一个适合你的列表

  • 项目

    • 项目

      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目 Value
电脑 $1600
手机 $12
导管 $1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文本居中 第二列文本居右 第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to-HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ(n)=(n−1)!∀n∈N\Gamma(n) = (n-1)!\quad\forall n\in\mathbb NΓ(n)=(n−1)!∀n∈N 是通过欧拉积分

Γ(z)=∫0∞tz−1e−tdt&ThinSpace;.\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞​tz−1e−tdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

ganttdateFormat  YYYY-MM-DDtitle Adding GANTT diagram functionality to mermaidsection 现有任务已完成               :done,    des1, 2014-01-06,2014-01-08进行中               :active,  des2, 2014-01-09, 3d计划一               :         des3, after des2, 5d计划二               :         des4, after des3, 5d
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::

张三李四王五你好!李四, 最近怎么样?你最近怎么样,王五?我很好,谢谢!我很好,谢谢!李四想了很长时间,文字太长了不适合放在一行.打量着王五...很好... 王五, 你怎么样?张三李四王五

这将产生一个流程图。:

链接
长方形
圆角长方形
菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

热门智力题 过桥问题和倒水问题相关推荐

  1. 过桥问题和倒水问题算法

    过桥问题和倒水问题都是笔试面试中的热门智力题,不但微软.GOOGLE.百度.腾讯等公司采用,甚至在IQ测试与公务员考试中都能见到.本文不但教你如何快速用手算来解决这两种问题,并且教你如何用程序代码来计 ...

  2. 小明一家过桥_智力题(小明一家过桥)

    题目: 智力题(小明一家过桥) 现在小明一家过一座桥,过桥时候是黑夜,所以必须有灯.现在小明过桥要1秒,小明的弟弟要3秒,小明的爸爸要6秒,小明的妈妈要8秒,小明的爷爷要12秒.每次过桥只能过2人,两 ...

  3. 【大厂智力题】水桶倒水问题

    先说第一个问题:5L和6L水桶,如何得到三升水? 我就想到了两种方法. 方法一: 6L水桶装满,倒入5L水桶将其装满,6L水桶中剩1L水 倒空5L水桶,将1L水转移到5L水桶中 6L水桶装满,倒入5L ...

  4. [分享]极富挑战性的大公司面试的智力题

    极富挑战性的大公司面试的智力题 一.摸豆子问题 5个囚犯,分别按1-5号,在装有100颗绿豆的麻袋里抓绿豆,规定每人至少抓一颗,而抓得最多 和最少的人将被处死,而且,他们之间不能交流,但在抓的时候,可 ...

  5. 【面试】场景 智力题

    目录 一.场景题 二.智力题 一.场景题 (1)十个海量数据问题及解决方案:面试必须掌握的十个海量数据问题及解决方案_hitxueliang的专栏-CSDN博客_海量数据问题 二.智力题 (1)5只猫 ...

  6. 微软Google等互联网公司经典面试智力题和解答

    一.微软58题  A.逻辑推理  1.你让工人为你工作7天,给工人的回报是一根金条.金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你 的工人付费?  2.请 ...

  7. 面试总结+网上查阅的智力题

    笔试了这么多家公司,每次笔试都过了,可是总是死在面试上,总结了很多原因: 1.其中有很多问题是随机性的,没有做好准备,所以要学会随机应变的能力,嘴比较笨,还是多学学良好的沟通,学会与人交流,应变的能力 ...

  8. 经典面试智力题和解答

    一.微软58题 A.逻辑推理        1.你让工人为你工作7天,给工人的回报是一根金条.金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你 的工人付费? ...

  9. 数值分析类智力题(IT产品类笔面试题型真题分析)

    导读: 1.老鼠与毒药问题 2.海盗分金问题 3.坏硬币问题/称球问题 4.跳棋问题        5.疯狗/帽子问题        6.三个宝盒的概率问题        7.分金条问题        ...

  10. [从菜鸟到高手演变]之智力题【史上最全】 (转)

    原文地址:http://blog.csdn.net/zhangerqing/article/details/8138296 PS:在一次偶然的机会中,发现了这篇文章.希望大家能开动脑经. 智力题,每个 ...

最新文章

  1. python——文件和数据格式化
  2. 【KVM系列02】KVM的CPU 和内存虚拟化
  3. 用JAVA制作微型操作系统4月23日情况
  4. 漫画:什么是区块链?
  5. [2013.8.29]马甲去重复 c++源码
  6. 18.9.22 考试总结
  7. 怎么在CAD编辑工具中绘制多边形线
  8. 未定义标识符_ConnectionPtr
  9. show tables mysql_MySQL_解析MYSQL显示表信息的方法,在用mysql时(show tables),有时候 - phpStudy...
  10. Dagger2 知识梳理(3) 使用 dependencies 和 @SubComponent 完成依赖注入
  11. 解决关于打开plist文件乱码问题,plist转换为xml文件的txt文件!
  12. python图像文字识别 - PyTesser
  13. 快速截图工具——百度输入法的扩展功能
  14. 无法启动程序因为计算机中丢失msvcr100,win7系统无法启动程序提示计算机中丢失msvcr100.dll的解决方法...
  15. java类名不能以数字开头_java变量为什么不能以数字开头
  16. 3D 人体姿态估计简述【转】
  17. realme真我gt能升级鸿蒙系统吗,realme真我GT Neo闪速版曝光,换用双电芯电池
  18. 【思科交换机常用命令汇总】
  19. HTTP响应的内容类型之Content-Type
  20. C++中typeid的使用

热门文章

  1. Android 伪装IP 亲测可行
  2. 全国近三成高考状元被曝有加分(图)
  3. editormd显示后台html,yaboxxx. -yaboxxx.V0.8.82
  4. JavaStudy13(MySQL)—B站韩顺平
  5. win10系统设置选择电源键按钮功能设置步骤
  6. from添加背景色 jsp_html框架怎么添加背景颜色
  7. Gym - 101177K Kiwis vs Kangaroos 水题手动打表
  8. HiWork发布1.7.0新版本——可开启频道公开链接,增加HiWork客服功能及集成应用麦客
  9. java for循环打印平行四边形,正三角形,菱形和空心菱形
  10. 用Photoshop将照片卡通化