HD 2050 折线分割平面

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2050

折线分割平面

我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。


HD 2050 折线分割平面_第1张图片



Input

输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0

Output

对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。

Sample Input

2

1

2

Sample Output

2

7

思考:在看到这个题目的时候记得自己高中的时候有做过直线分平面的问题,主要记得好像是和直线的交点有关,但是印象不怎么深刻所以就百度了一下,根据直线分平面可知,由交点决定了射线和线段的条数,进而决定了新增的区域数。

 每个折线都可以把它看成是两条直线相交,而两者的区别在于每多一个折角,都会少两个区域,这里为什么是两个区域,自己画图一看就明白了,所以,一条折线可以看成两条直线相交所分割的区域减2,两条折线可以看成是四条直线所分割的区域减4,三条折线可以看成是四条直线所分割的区域减6,,,规律就是这样。而要找到n条直线相交最多可以划分多少个区域的问题就简单多了。

由网上的调查总结一下:

  其实这种类型所有的问题都可以从多出几个点、每个点又能增加多少个平面来看

①直线分割平面(默认是求可以分割出的最大平面数


HD 2050 折线分割平面_第2张图片


    显然一条直线可以将平面划分为两部分,如果再多一条直线,显然它要和前面的直线相交才能获得最大平面数,这时多出1个交点,这个交点使得平面数多出了2(画一下图可以很清楚看到);以此类推,可以发现,当画第n条直线时,它可以与前面n-1条直线形成n-1个交点,可以使平面数多出(n-1)+1=n。

    这样我们就可以求出表达式了:  Sn=1+1+2+⋯+n=1+n(n+1)/2;

    所以说,n条直线可以分割出最大的平面数为 n*(n+1)/2+1。

②折线分割平面

  所谓的折线就是两条起点相同的射线,如下图:


HD 2050 折线分割平面_第3张图片

从图中可以看到,每多出一条折线,都会多出4*(n-1)个交点,也就是说会 多出4*(n-1)+1个平面,那么我们可以得到递推式:

      f [n] = f [n-1] +4*(n-1)+1

③Z形线分割平面

其实这个跟前两个思路也一样,找出每次画一个Z形线会多出来几个交点。画完图后很清楚可以看到,每次多9个;

也就是说,递推式可以写成:

        f [n] = f [n-1]+9* (n-1) +1


代码如下:

#include

int main(){

int n,a;

scanf("%d",&n);

while(n--){

scanf("%d",&a);

printf("%d\n",2*a*a-a+1);

}

return 0;

}

你可能感兴趣的:(HD 2050 折线分割平面)