聪明的学生问题

来源:互联网 发布:mac系统显示隐藏文件夹 编辑:程序博客网 时间:2024/05/01 04:15

题目大概如下图所示:


本题目的解答方法参考了《算法艺术与信息学竞赛》。


由题意可以知道,每个人判断的依据是【其他人头上的数】和【其他人作出的否定回答】两方面。

因为三个数中,定有一个是另两个数的和,所以当其中一个人看到另两个人的数时,他可以判断自己的数是【两者之和】或者【两者之差】其中的某一种。

因为三个数都是正整数,所以如果某个学生看到另两个人头上的数相等,则可立即判断自己的数是另两者数之和。否则,则可判断出这两人的数不相等。由此也可以知道,总是拥有最大数的人猜出结果。

举一个实际例子,假设三个人为A,B,C,他们的数字分别是2,8,6,则在第五次猜测,也就是B进行第二次猜测的时候,猜到自己的数是8.

因为:在第五次猜测的时候,他看到的是A的2和C的6,则他可能的数字是8或者4.但是如果是4,则C在第三次猜测的时候,就能猜出答案(这种情况下,C拥有最大的数6)。因为C看到的是A的2和B的4,则C的可能数字是2或者6,但是如果是2,则B在第二次猜测的时候,就可以得到答案,因为B看到的是2和2。所以逆推回去可知,B的数是8。

这样的推理是假设--排除的过程。即假设自己的数是两个数种的其中一种,如果另两个人可以在自己之前猜出,则这种可能性就可以排除。

在知道上面的推理后,我们先来解决【已知A,B,C三人的三个数分别为x,y,z时,最少需要几次,才会有人猜到自己的数字】这个问题,这个问题跟图里的问题是相反的,一会我们再去解决那个问题。

因为我们知道,总是数字最大的人最先猜到结果,所以给定x,y,z的时候,结果就已经定下了。假设其中z最大,则x+y=z。C得到结果的依据是排除了z=|x-y|这种可能性,即假设z=|x-y|,则A和B中数字较大的那个人将在上一次猜测的时候得到结果。(如果x>y,则A会在C进行本次猜测之前2次得到结果;如果x<y,则B会在C进行本次猜测之前1次得到结果。)

所以我们能得到下面的递推式:

假设times(i,j,a,b,c)表示a,b,c三人的数字分别是i,j,i+j时,猜到结果所需的次数,而p(x,y)表示从人x问到人y所需要提问的次数(比如在上例中,p(A,C)=2),

则有

times(i,j,a,b,c)= c所对应的次序, ( if i=j)  (如在上例中,B的次序为2,表示从第一次问开始,问到B需要2次)

=times(i,j-i,a,c,b)+p(b,c)  (if j>i) (表示等于最大的数是j时所需要的提问次数加上从b问到c所需要问的次数)

=times(j,i-j,b,c,a)+p(a,c) (if i>j)


利用这个递推式,我们就能一步一步得到结果。

回到开始的问题,即已知【提问的次数】和【猜到的数】,求另两个数的值。同样我们可以利用这个递推式。

因为提问的次数较小,而每次递推时,总要加上一个正整数p(x,y),则可以通过对另两个数i和j假设大小关系,依次递推,同时保证总提问次数恰好等于已知的次数,就能得到结果。

这个题的结果应该是有四组(36,108),(108,36),(54,90),(64,80).

原创粉丝点击