智力题(一)

摘自九章算法

题1: “1000个⼈,初始所有灯都是关着的,1 号把所有灯打开,2 号把所有偶数的 灯关上,3 号把所有是 3 的倍数的灯作相反操作...问最后哪些灯是开着的。

 

有N个灯放在一排,从1到N依次顺序编号。有N个人,也从1到N顺序编号。1号将灯全部关闭,2号将凡是2的倍数的灯全部打开;3号将3的倍数的灯全部作相反操作(该灯如为打开,则将它关闭;如关闭,则将灯打开)。以后的人,都和3号操作一样,将凡是自己序号倍数的灯作相反操作。第N个人操作完之后,一共有几盏灯亮着?
 

思路:每个位置被访问的次数是奇数还是偶数 https://blog.csdn.net/cyqiang2008/article/details/105181789/

突破点:最后开着的灯有什么性质? 开着的灯被访问的次数一定是奇数,如果是偶数的话,第一次访问打开,第二次访问就被关闭了。最后发现如果一个数拥有成对的约数,那么就为关闭。如果有奇数个的话,就会开启。

结论:完全平方数。例如18 (1 2 3 6 9 18) = (1 18) ( 2 9) (3 6)偶数个约数,对应着改变偶数次。

而9 (1 9 ) (3 3),奇数个约数,对应改变奇数次。

 

题目2:1000个灯围成⼀个环,初始状态是熄灭的,按⼀个灯,它以及它的左右两盏灯的状态会改变,问如何让所有灯都亮?

思路:⼀样的思路,怎么样才能让每个位置被访问奇数次呢?
每个人状态最多改变3次,自己按的时候改变一次,然后左边按的时候改变一次,右边按的时候改变一次。所以只要每个人都按一次就可以实现。

 

题目3:

n条直线最多能将一个平面分成多少部分?https://www.nowcoder.com/ta/nine-chapter/review?tpId=1&tqId=10809&query=&asc=true&order=&page=28

 

 

 

f(n)=f(n-1)+n。
f(n-1)=f(n-2)+n-1
......
f(1)=f(0)+1;
f(0)=1;
等式左右相加可以得到:f(n)+f(n-1).....+f(0)=f(0)+(f1)+.....+f(n-1)+1+1+2+...+n;
f(n)=1+n(n+1)/2

 

题目4:n 个平⾯最多能将⼀个空间分成多少个部分

 

 

 

题目5: “两个机器⼈,初始时位于数轴上的不同位置。给这两个机器⼈输⼊⼀段相同 的程序,使得这两个机
器⼈保证可以相遇。程序只能包含“左移 n 个单位”、“右移 n 个单位”,条件判断语句 If,循环语句 while,以及
两个返回 Boolean 值的 函数“在⾃⼰的起点处”和“在对⽅的起点处”。你不能使⽤其它的变量和计数器。
 

思路:两个机器人同时向右移动,若其中一个到达了另一个的起点,那个每次就走2步,跟上另外一个人。

while (!at_other_robot_start())
 move_right(1);
while (true)
 move_right(2)

以上的方法都需要找到一个关键点,还可以突破进行解题


接下来介绍一些需要使用方程进行求解的

题目1:⼀个猴⼦往家搬⾹蕉,起点处有 100 个⾹蕉,每⾛ 1 ⽶要消耗⼀个⾹蕉,起点离家 50 ⽶,并且猴⼦⼀次最多只能拿 50 根⾹蕉,问最后最多能拿多少个⾹蕉 回家 (你可以把香蕉拿了然后放在路边)

 

题目2:有 n 个⼈,互相⽐赛,⼀个⼈输掉 4 次就出局(不能继续⽐赛),赢 7 次通过(可以继续⽐赛),⼀个⼈最多⽐10局,问最多通过⼈数

 

 

题目3:海盗分金问题,这个很有意思哈哈

经济学上有个“海盗分金”模型:是说5个海盗抢得100枚金币,他们按抽签的顺序依次提方案:首先由1号提出分配方案,然后5人表决,投票要超过半数同意方案才被通过,否则他将被扔入大海喂鲨鱼,依此类推。“海盗分金”其实是一个高度简化和抽象的模型,体现了博弈的思想。在“海盗分金”模型中,任何“分配者”想让自己的方案获得通过的关键是事先考虑清楚“挑战者”的分配方案是什么,并用最小的代价获取最大收益,拉拢“挑战者”分配方案中最不得意的人们。

直接看https://baike.baidu.com/item/%E6%B5%B7%E7%9B%97%E5%88%86%E9%87%91/172169?fr=aladdin 

 

题目4:两个软硬程度⼀样的鸡蛋,它们在某⼀层摔下会碎,有个100层的建筑,要求最多⽤两个鸡蛋确定
鸡蛋安全下落的临界位置

动态规划方法
100层楼2个鸡蛋:f[n] = min(1 + max(i - 1, f[n - i])) i = 1……n
n层楼m个鸡蛋:f[i, 0] = 0; f[n,m] = min(1 + max(f[i - 1, m - 1], f[n - i, m]) i = 1…n

 


 

题目一:“找明星问题

两两比较的时候用临时变量存储下候选明星
线性扫描一遍,两两比较,每次比较都会排出一个人:若a认识b,则a一定不是明星;若a不认 识b,则b一定不是明星;n很大的情况下可以采用分布式方法,每个机器处理一部分数据,最后每个 机器选出一个候选,归并。

 

题目2:⼀个绳⼦从⼀头开始烧是1⼩时,要求想办法测出45分钟
用甲乙两根绳.先同时点燃甲的两端以及乙的一端,当甲烧完后过去了30分钟,因为是两头烧,所以就是30分钟.而乙已经烧了30分钟,还有30分钟的量,此时再点燃乙的另一端.双管齐下,剩下的30分钟只烧了15分钟,加上一开始已经烧了30分钟,共45分钟

 

 

题目3:给50个硬币,⾯值可以不同,排成⼀排,两个⼈轮流取,只 能从两端取,先取的⼈如何保证取到的币值⼤于等于另⼀个⼈”
(博弈问题,考虑奇偶性)
 

感觉很多问题都可以这样考虑哦

看奇数位的数的和以及偶数位的数的和哪个大,若奇数位的大选第一个,否则选最后面的(这里假设奇数位和偶数位的和不同)若出现相同,可以采用动态规划的思路来做

 

题目4:25匹马,5个跑道,每个跑道最多能有1匹马进行比赛,最少比多少次能比出前3名?前5名?

找出前3名最少需要7场就可以确定。首先我们将25匹⻢马分成5组,分别为ABCDE,5组分别进行比赛决出各小组名次;接着让各小组第一进行比赛决出冠军,我们假设各小组第一分别是A1, B1, C1, D1, E1,并且速度A1 > B1 > C1 > D1 > E1;接着2,3名可以在一场比赛内决出,分别由A2, A3, B1, B2, C1参赛;这样总共进行了5 + 1 + 1 = 7场; 找出前5名的思路和这个类似。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值