HDU 1290 献给杭电五十周年校庆的礼物(递推)

Problem Description
或许你曾经牢骚满腹
或许你依然心怀忧伤
或许你近在咫尺
或许你我天各一方

对于每一个学子
母校 
永远航行在
生命的海洋

今年是我们杭电建校五十周年,这是一个值得祝福的日子。我们该送给母校一个怎样的礼物呢?对于目前的大家来说,最好的礼物当然是省赛中的好成绩,我不能参赛,就送给学校一个DOOM III球形大蛋糕吧,这可是名牌,估计要花掉我半年的银子呢。

想象着正式校庆那一天,校长亲自操刀,把这个大蛋糕分给各地赶来祝贺的校友们,大家一定很高兴,呵呵,流口水了吧...

等一等,吃蛋糕之前先考大家一个问题:如果校长大人在蛋糕上切了N刀(校长刀法极好,每一刀都是一个绝对的平面),最多可以把这个球形蛋糕切成几块呢?

做不出这个题目,没有蛋糕吃的!
为-了-母-校-,为-了-蛋-糕-(不是为了DGMM,枫之羽最会浮想联翩...),加-油-!
 

Input
输入数据包含多个测试实例,每个实例占一行,每行包含一个整数n(1<=n<=1000),表示切的刀数。
 

Output
对于每组输入数据,请输出对应的蛋糕块数,每个测试实例输出一行。
 

Sample Input
  
  
1 2 3
 

Sample Output
  
  
2 4 8
 

Author
lcy
 

做这道题刚开始没想出来! ! ! 最后一看,就是一个公式的问题,下面来一步一步推推公式。

一、先要弄清楚直线分割平面的问题。

都知道,直线要分割平面最多的前提条件是:任意两条直线都要相交,且任意三条直线不能有同一个交点

一条直线把平面分成两部分,即 f(1) = 2;

两条直线把平面分成四部分,即 f(2) = 4;

..............

设n-1条直线把平面分成f(n-1);

接下来看看f(n)与f(n - 1)的关系. n条直线要想分得最多的部分。则第n条直线与n - 1条直线任意直线都要相交,且任意三条直线不能有同一个交点。那么第n条直线与其他直线有n - 1个交点,这n - 1个交点把第n条直线分成了n段,通过画图可知,这n段把它所在的区域一分为二。即f(n) = f(n - 1) + n;

由此可知

f(1) = 2;

f(2) =f(1) + 2;

f(1) =f(2)  + 3;

.................

f(n - 1) = f(n - 2) + n -1 ;

f(n) = f(n - 1 ) + n;

f(n) = f(1) + 2 + 3 + 4 + 5 +      +n;

则直线分最大平面的通项为     f(n) = 1/2 * (n*n + n)  + 1;   可以看出n = 1是也符合。

二、平面分空间

跟直线分平面一样,这里也是   要任意两个平面都相交,且任意三个平面不能有同一交线

一个平面把空间分成2部分,两个平面把空间分成4部分,3个平面把空间分成八部分、、、判断n个平面最大分割空间数目。F(n) = ?。

PS:刚开始一直不明白3个平面把空间分成把部分是怎么做到的,其实是第3个平面与前2个平面有两条交线,因为在空间可以假设无限大,那个可以是这两条交线在第三个平面内相交,那第三个平面就被分成4部分,每部分把它原来的区域一分为2 ,那个就比F(2)多了4部分。即为8.

根据3个平面的情况应该就知道公式,直接给出

F(n) = 2 + 1 / 2 *(1 * 1 + 1) + 1+ 1 / 2 *(2 * 2 + 2) + 1+ 1 / 2 *(3 * 3 + 3) + 1 +       + 1 / 2 *((n - 1) * (n - 1) + (n - 1)) + 1

F(n) = n + 1 + 1 / 2 * (1 * 1  + 2 * 2 + 3 * 3 +   + (n - 1) * (n - 1) ) + 1 / 2 * ( 1 + 2 + 3 + 4 +  + (n - 1))

最后求出通项公式即为     F(n) = (n * n * n + 5 * n + 6) / 6;     带入1,也符合通项。

PS:平方项的通项公式如何求?百度一下。。。。。囧~~~~

1^2+2^2+3^2+……+n^2=n(n+1)(2n+1)/6 

具体算法
利用立方差公式 
n^3-(n-1)^3=1*[n^2+(n-1)^2+n(n-1)] 
=n^2+(n-1)^2+n^2-n 
=2*n^2+(n-1)^2-n 

各等式全相加就得到咯
代码如下

#include<stdio.h>
int main()
{
    long long n;
    while(scanf("%lld",&n) != EOF)
    {
        n = (n * n * n + 5 * n + 6) / 6;
        printf("%lld\n",n);
    }
    return 0;
}

推广一下,

折线分平面(摘自网络)。

根据直线分平面可知,由交点决定了射线和线段的条数,进而决定了新增的区域数。当n-1条折线时,区域数为

f(n-1)。为了使增加的区域最多,则折线的两边的线段要和n-1条折线的边,即2*(n-1)条线段相交。那么新增的线段数为4*(n-1),射线数为2。但要注意的是,折线本身相邻的两线段只能增加一个区域。
故:f(n)=f(n-1)+4(n-1)+2-1
=f(n-1)+4(n-1)+1
=f(n-2)+4(n-2)+4(n-1)+2
……
=f(1)+4+4*2+……+4(n-1)+(n-1)
=2n^2-n+1。


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值