代码改变世界

一道经典数学题及其周边问题

2009-05-01 17:58  Logic0  阅读(275)  评论(1编辑  收藏  举报
我顶 字号:

题目:

http://acm.hdu.edu.cn/showproblem.php?pid=1290

切球形蛋糕,N刀最多切多少块的问题。

 

先来看下其周边的几个简单问题:

1.同一个平面内的N条直线,最多有多少个交点。

2.有一个平面,问N条直线最多可以将这个平面分成几部分。

3.有一个三维空间,问N个平面最多可以将这个空间分成几部分。

 

问题分析:

  • 先看第一个问题。

    先看只有少数几条直线的情况:

    1. 两条直线如果平行则没有交点,相交则有一个交点
    2. 有三条直线l1,l2,l3的时候,l1//l2//l3,则没有交点;l1//l2,l3不平行与l1或者l2,有两个交点;l1与l2不平行时,有一个交点,l3与他们相交,l3的交点数为 2 = n - 1;
    3. 四条直线的时候,是三条直线相交的最多交点数+3。
    4. 扩展到n条直线的情况,交点数量为(n-1)条直线的交点数+第n条直线上的交点数。

    总结方程:

         f(n) = f(n-1)+(n-1)  ================>> f(n) = n*(n-1)/2  , n > 0

  •  第二个问题

    利用第一个题的规律,加入第n条直线后,第n条直线上的(n-1)个点讲这条线分为n段,多出来n个面(为了避免重复计算,只算加入的直线一侧的面即可)

    总结方程:

            f(n) = f(n-1)+n , f(0) = 1 , f(1) = 2;=======>> f(n) = n*(n-1)/2+1;

  • 第三个问题

    综合前两个问题。假设前(n-1)个面把空间分成了f(n-1)个部分,则加入第n个面后,要达到最多,则必须与前(n-1)个面都相交,则第n个面上会出现(n-1)条交线,把第n个面分成了(n*(n-1)/2+1)个子平面,而每个子平面都可以将空间分为2部分,避免重复计算,只计算一侧的空间数,这样就可以推理得知:

            f(n) = f(n-1) + n*(n-1)/2 + 1  =========>>f(n) = (n*n*n+5*n+6)/6;

 

    切蛋糕问题就是第三个问题的不同叙述而已。