范德萨发而为
全部博文(392)
分类: C/C++
2011-10-27 13:11:53
蛋糕终于是买回来了,路路的朋友们已经迫不及待来吃蛋糕了。为了公平起见,每个人都将分到一块蛋糕。可是路路是一个很懒的家伙,他想用最少的刀数分出他想要的蛋糕块数,不论大小和形状。下面请开动你的脑筋告诉这个懒家伙该怎么做,蛋糕切法按照常理理解。
从题目中提供的条件来看,蛋糕按照常理可以抽象为一个圆形(平面图形),而切开的印痕可以抽象为一条直线,所以这个问题需要研究平面内的n条直线所能分割出平面的块数。
平面的直线分割
这个问题的核心就是研究直线数n和分得块数Sn之间的关系。
首先我们看一些简单的例子:
这里的八幅图简单阐释了在直线数n最小的情况下,分得块数的情况。
进行深入研究发现,在直线数一定的情况下,要取得更多的块数,必须将直线尽可能两两相交,而避免多条直线相交于一点和平行关系的出现。
当平面中有k条直线时,加入一条新的直线,那么最多可以添加出k个新块。()
上述理论很容易推导出来:新添加的直线要尽可能多的和已有直线产生交点,才能使得分得的块数尽量的多。同时新产生的交点不能和已有交点重合,也就是尽量保证直线都是两两相交的状态,这样才能做到分得的块数尽量的多。至多产生k个交点,分得块数至多产生k块。
当没有直线时,平面块数记为1。一直保持用最少的刀数得到最多的块数,得到如下表格:
块数 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
刀数 | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 4 | 4 | 4 | 4 | 5 |
根据这个表格不难得到这道题的解题要领,但下面我们要讨论的是直线分割平面中直线数和平面块数之间的关系。
进一步讨论直线数和平面块数的关系
当没有任何直线时,平面块数记为1。使用->表示直线数和能够产生最多的平面块数的关系:
0 –> 1
1 –> 2
2 –> 4
3 –> 7
4 –> 11
我们对上述平面块数做一个分解:
0 –> 1 = 1
1 –> 2 = 1 + 1
2 –> 4 = 1 + 1 +2
3 –> 7 = 1 + 1 + 2 + 3
4 –> 11 = 1 + 1 + 2 + 3 + 4
为什么会得到这样的分解呢?
直线数为0时,平面分割的最多块数为1;
直线数为1时,原有直线数为0,添加第一条直线后,增加1块,最多块数为1 + 1 = 2;
直线数为2时,原有直线数为1,添加第二条直线后,增加2块,最多块数为1 + 1 + 2 = 4;
直线数为3时,原有直线数为2,添加第三条直线后,增加3块,最多块数为1 + 1 + 2 + 3 = 7;
直线数为4时,原有直线数为3,添加第四条直线后,增加4块,最多块数为1 + 1 + 2 + 3 + 4 = 11;
以此类推,得到最多块数与直线数的关系式为:
Sn = 1 + (1 + 2 + 3 + … + n) (n为直线数)
使用等差数列求和公式将括号内部分化简得:
Sn = 1+ n(n + 1) / 2
这就是直线平分平面,所得最多块数的公式,也是本题的解题关键。用程序实现这个公式,根据Sn反推n即可。
注意:每增加一个交点,可以多出一个平面!!
最后总结出来的规律就是,当前有n条直线,每增加一条直线,可以多出来n个交点,而多出来n个交点对应到可以多出n+1个平面
http://www.richardma.org/blog/2010/10/17/lines-in-plane/