给一个瞎子52张扑克牌,并告诉他里面刚好有10张牌是正面朝上的。要求这个瞎子把牌分红两堆,使得每堆牌里正面朝上的牌的张数同样多。瞎子应该怎么作?递归
答案:把扑克牌分红两堆,一堆10张,一堆42张。而后,把小的那一堆里的全部牌所有翻过来。数学
如何用一枚硬币等几率地产生一个1到3之间的随机整数?若是这枚硬币是不公正的呢?并行
答案:若是是公正的硬币,则投掷两次,“正反”为1,“反正”为2,“正正”为3,“反反”重来。方法
若是是不公正的硬币,注意到出现“正反”和“反正”的几率同样,所以令“正反反正”、“反正正反”、“正反正反”分别为一、二、3,其他状况重来。另外一种更妙的办法是,投掷三次硬币,“正反反”为1,“反正反”为2,“反反正”为3,其他状况重来。集合
30枚面值不全相同的硬币摆成一排,甲、乙两我的轮流选择这排硬币的其中一端,并取走最外边的那枚硬币。若是你先取硬币,能保证获得的钱不会比对手少吗?数字
答案:先取者可让本身老是取奇数位置上的硬币或者老是取偶数位置上的硬币。数一数是奇数位置上的面值总和多仍是偶数位置上的面值总和多,而后老是取这些位置上的硬币就能够了。生成
一个环形轨道上有n个加油站,全部加油站的油量总和正好够车跑一圈。证实,总能找到其中一个加油站,使得初始时油箱为空的汽车从这里出发,可以顺利环行一圈回到起点。颜色
答案:总存在一个加油站,仅用它的油就足够跑到下一个加油站(不然全部加油站的油量加起来将不够全程)。把下一个加油站的全部油都提早搬到这个加 油站来,并把油已被搬走的加油站无视掉。在剩下的加油站中继续寻找油量足以到达下个加油站的地方,不断合并加油站,直到只剩一个加油站为止。显然从这里出 发就能顺利跑彻底程。
另外一种证实方法:先让汽车油箱里装好足够多的油,随便从哪一个加油站出发试跑一圈。车每到一个加油站时,记录此时油箱里剩下的油量,而后把那个加油站的油所有装上。试跑完一圈后,检查刚才路上到哪一个加油站时剩的油量最少,那么空着油箱从那里出发显然必定能跑彻底程。
初始时,两个口袋里各有一个球。把后面的n-2个球依次放入口袋,放进哪一个口袋其几率与各口袋已有的球数成正比。这样下来,球数较少的那个口袋平均指望有多少个球?
答案:先考虑一个看似无关的问题——怎样产生一个1到n的随机排列。首先,在纸上写下数字1;而后,把2写在1的左边或者右边;而后,把3写在最 左边,最右边,或者插进1和2之间……总之,把数字i等几率地放进由前面i-1个数产生的(包括最左端和最右端在内的)共i个空位中的一个。这样生成的显 然是一个彻底随机的排列。
咱们换一个角度来看题目描述的过程:假想用一根绳子把两个球拴在一块儿,把这根绳子标号为1。接下来,把其中一个小球分裂成两个小球,这两个小球用 标号为2的绳子相连。总之,把“放进第i个球”的操做想象成把其中一个球分裂成两个用标有i-1的绳子相连的小球。联想咱们前面的讨论,这些绳子的标号事 实上是一个随机的全排列,也就是说最开始绳子1的位置最后等可能地出如今每一个地方。也就是说,它两边的小球个数(1,n-1)、(2,n-2)、 (3,n-3)、……、(n-1,1)这n-1种状况等可能地发生。所以,小袋子里的球数大约为n/4个。准确地说,当n为奇数时,小袋子里的球数为 (n+1)/4;当n为偶数时,小袋子里的球数为n^2/(4n-4)。
考虑一个n*n的棋盘,把有公共边的两个格子叫作相邻的格子。初始时,有些格子里有病毒。每一秒钟后,只要一个格子至少有两个相邻格子染上了病毒,那么他本身也会被感染。为了让全部的格子都被感染,初始时最少须要有几个带病毒的格子?给出一种方案并证实最优性。
答案:至少要n个,好比一条对角线上的n个格子。n个格子也是必需的。当一个新的格子被感染后,全体被感染的格子所组成的图形的周长将减小0个、 2个或4个单位(具体减小了多少要看它周围被感染的格子有多少个)。又由于当全部格子都被感染后,图形的周长为4n,所以初始时至少要有n个被感染的格 子。
在一个m*n的棋盘上,有k个格子里放有棋子。是否总能对全部棋子进行红蓝二染色,使得每行每列的红色棋子和蓝色棋子最多差一个?
答案:能够。建一个二分图G(X,Y),其中X有m个顶点表明了棋盘的m个行,Y有n个顶点表明了棋盘的n个列。第i行第j列有棋子就在X(i) 和Y(j)之间连一条边。先找出图G里的全部环(因为是二分图,环的长度必定是偶数),把环里的边红蓝交替染色。剩下的没染色的图必定是一些树。对每棵树 递归地进行操做:去掉一个叶子节点和对应边,把剩下的树进行合法的红蓝二染色,再把刚才去掉的顶点和边加回去,给这个边适当的颜色以知足要求。
任意给一个88的01矩阵,你每次只能选一个33或者4*4的子矩阵并把里面的元素所有取反。是否总有办法把矩阵里的全部数所有变为1?
答案:不能。大矩阵中有36个33的小矩阵和25个44的小矩阵,所以总共有61种可能的操做。显然,给定一个操做序列,这些操做的前后顺序 是可有可无的;另外,在一个操做序列中使用两种或两种以上相同的操做也是无用的。所以,实质不一样的操做序列只有2^61种。但8*8的01矩阵一共有 2^64种,所以不是每种状况都有办法达到目的。
五个洞排成一排,其中一个洞里藏有一只狐狸。每一个夜晚,狐狸都会跳到一个相邻的洞里;每一个白天,你都只容许检查其中一个洞。怎样才能保证狐狸最终会被抓住?
答案:按照2, 3, 4, 2, 3, 4的顺序检查狐狸洞能够保证抓住狐狸。为了说明这个方案是可行的,用集合F表示狐狸可能出现的位置,初始时F = {1, 2, 3, 4, 5}。若是它不在2号洞,则次日狐狸已经跑到了F = {2, 3, 4, 5}。若是此时它不在3号洞,则第三天狐狸必定跑到了F = {1, 3, 4, 5}。若是此时它不在4号洞,则再过一晚后F = {2, 4}。若是此时它不在2号洞,则再过一天F = {3, 5}。若是此时它不在3号洞,再过一天它就必定跑到4号洞了。
方案不是惟一的,下面这些方案都是可行的:
2, 3, 4, 4, 3, 2
4, 3, 2, 2, 3, 4
4, 3, 2, 4, 3, 2
一个经典老题是说,把一个333的立方体切成27个单位立方体,若每一刀切完后都容许从新摆放各个小块的位置,最少能够用几刀?答案仍然是6刀,由于 正中间那个单位立方体的6个面都是后来才切出来的,所以怎么也须要6刀。考虑这个问题:若把一个nnn的立方体切成一个个单位立方体,最少须要几刀?
答案:事实上,从一个更强的命题出发反而能使问题变得更简单。对于一个abc的长方体,咱们须要f(a)+f(b)+f(c)刀,其中 f(x)=⌈log(x)/log(2)⌉。只须要注意到,在整个过程当中的任何一步,切完当前最大的块所须要的刀数也就等于整个过程还须要的刀数,由于其 它小块须要的刀数都不会超过最大块所需刀数,它们均可以与最大块一道并行处理。这代表,咱们的最优决策便是让当前的最大块尽量的小,也就是说要把当前的 最大块尽量相等地切成两半。利用数学概括法,咱们能够很快获得本段开头的结论。