一些面经(2)---智力题


一个7分钟沙漏a7,一个4分钟沙漏a4。怎样计时9分钟?


先同时漏a7a4,a4漏完后翻转,和a7剩下的三分钟同时漏,a7漏完后再翻转和a4的一分钟一起漏,a4漏完后a7一端就有一分钟,这时再翻转a7直到漏完,4+3+1+1=9


你有一架天平和 N 个砝码,这 N 个砝码重量依次是 W1, W2, · · · , WN。 请你计算一共可以称出多少种不同的重量? 注意砝码可以放在天平两边。


数据结构(普通数组) + 算法(动态规划)。
  [1] 初始化一个 bool 类型的普通数组 a[i][j],i 代表的是“装入前 i 个砝码”,j 代表的是“重量j”,a[i][j] 代表的是 “装入前 i 个砝码后,能否凑成重量为 j 的情况,能凑成的话,值就为 true,否则为 false”。
  [2] 有 N 个砝码,就遍历 N 遍,每遍装入一个新的砝码。在每次遍历中要做 [3] 和 [4] 两件事。
  [3] 首先,继承上一轮的结果。因为对于 “前 i 个砝码能凑成的所有重量的集合” ,那么前 i+1 个砝码一定也能凑到。
  [4] 然后遍历继承上一轮结果的 a[i][j](只有 j 在变),然后我们就去看,在 a[i][j] ==false 的情况下,是否能通过某种手段(代码中的三种)使得 a[i][j] 变为 true。


rand(5)生成rand(7)


只要我们将Rand5 映射到一个能产生更大随机数的Randa,其中a > 7(Randa一定是要满足等概率生成1到a的)
1.Rand5产生1到5的数,减1就产生0到4的数,乘以5后可以产生的数是:0,5,10,15,20。 再加上第二个Rand5()产生的1,2,3,4,5。我们可以得到1到25, 而且每个数都只由一种组合得到,即上述代码可以等概率地生成1到25。
2.因为Rand25会产生1到25的数,而只有1到7时才跳出while循环, 生成大部分的数都舍弃掉了。这样的实现明显不好。我们应该让舍弃的数尽量少, 于是我们可以修改while中的判断条件,让x与最接近25且小于25的7的倍数相比。 于是判断条件可改为x > 21,于是x的取值就是1到21。 我们再通过取模运算把它映射到1-7即可。
int Rand7(){
int x = ~(1<<31); // max int
while(x > 21)
x = 5 * (Rand5() - 1) + Rand5() // Rand25
return x%7 + 1;
}


猎人抓狐狸问题


狐狸有五个一次排开的洞每天轮流住,且相邻两天它会住在相邻的洞里,猎人每天可以去查看一个洞,问需要几天可以确保抓住狐狸?
思路:首先我们给洞编号 1 2 3 4 5
第一天去2号洞。如果2号洞没有抓到狐狸,则第一天狐狸可能在 1 3 4 5号洞
预判:第二天狐狸可能在 2 3 4 5号洞
第二天去3号洞。如果3号洞没有抓到狐狸,则第二天狐狸可能在 2 4 5号洞
预判:第三天狐狸可能在1 3 4 5号洞
第三天去4号洞。如果4号洞没有抓到狐狸,则第三天狐狸可能在1 3 5号洞
预判:第四天狐狸可能在2 4 号洞
第四天去2号洞。如果2号洞没有抓到狐狸,则第四天狐狸可能在4号洞
预判:第五天狐狸可能在3 5号洞
第五天去3号洞。如果3号洞没有抓到狐狸,则第五天狐狸可能在5号洞
预判:第六天狐狸可能在4号洞
第六天去4号洞
一定能抓到狐狸!

对于n个洞的答案:

不论n多大,最坏情况下只需2n−4天就能逮到狐狸,策略是这样的:
若n为奇数,则从第一天开始搜寻的山洞编号为:2, 3, 4, …, n-1, 2, 3, 4, …, n-1
若n为偶数,则从第一天开始搜寻的山洞编号为:2, 3, 4, …, n-1, n-1, n-2, …, 3, 2
不管哪种情况,只需2n−4步即可逮到狐狸。


赛跑问题


一共有25个人参加赛跑比赛,但是只有五条赛道,同时只能保证五个人进行比赛,问至少比赛多少次可以选出前三名。
1、将25个人分成五组,比赛五次,每组选出前三名。计5次。
2、让每一组的第一名进行一轮比赛,选出前三名,设为A1>B1>C1。计1次。淘汰D、E全组
C1最多是第3名,淘汰C2,C3
B1最多是第2名, B2最多是第3名,淘汰B3.
A1一定是第1名,不参与接下来的比赛。
3、这时候,剩下5名选手,进行最后一轮比赛,选出两名,加上A1,共计三位选手。计1次。
所以,至少比赛7次可以选出前三名。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值