HOJ2050:折线分割平面

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

Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。

 

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

 

Sample Input
 
  
2 1 2
 

Sample Output
 
  
2 7

对于直线分割平面的情况:

N条直线,两两相交,其交点各不不同,则产生的交点数目为N个数中取2个数的组合; 同时,也只有这种情况下(两两相交,也交点不同),分割的平面数最多, 数目为: 2 + (N-1)(N+2)/2.  这里求最少平面数没有意义,因为最少平面数就是N+1, 即N条直线两两平行的时候,分割的平面最少。

举例

1条直线分割平面数最多为2;                                             a1 = 2

2条直线分割平面数最多为4;    为1条直线时分割数目+2    a2 = a1 + 2

3条直线分割平面数最多为7;    为2条直线时分割数目+3    a3 = a2 + 3 = a1 + 2 + 3

4条直线分割平面数最多为11;  为3条直线时分割数目+4    a4 = a3 + 4 = a1 + 2 + 3 + 4

5条直线分割平面数最多为16;  为4条直线时分割数目+5    a5 = a4 + 5 = a1 + 2 + 3 + 4 + 5

6条直线分割平面数最多为22;  为5条直线时分割数目+6    a6 = a5 + 6 = a1 + 2 + 3 + 4 + 5 + 6

因此 an = a1 + 2 + 3 + ... + n. 

可以看到分割的平面数的差值按照等差数列递增,因此 第N条直线分割的最多平面数为:2 + (n-2+1)(2+n) / 2.

或者

    对n条直线最多划分平面数:

        (1)使用递归

             f(n) = n + f(n-1) ,   n > 1     

             f(n) = 2               ,   n = 1

        (2)使用递推

             n = 1,  S1 = 2        

             n > 1,  Sn = 2 + 2 + 3 + …… + n  = 1 + n * (n+1) / 2


解题思路:

1递推递推,先分析下直线分割平面的情况,增加第n条直线的时候,跟之前的直线最多有n-1个交点,此时分出的部分多出了(n-1)+1。

2.折线也是同理,f(1)=2,f(2)=7,先画好前面n-1条折线,当增加第n条,折线时,此时与图形新的交点最多有2*2(n-1)个,所以分出的部分多出

了2*2(n-1)+1,所以推出f(n)=f(n-1)+4*(n-1)+1,n>=3。


#include<iostream>
using namespace std;
#define MAX 10010 
__int64 arr[MAX];

void func(){
    arr[1]=2;
    arr[2]=7;
    for(int i=3;i<MAX;i++)
    {
        arr[i]=arr[i-1]+4*(i-1)+1;
    }
}
int  main()
{
    int num,a;
    func();
    while(cin>>num)
    {    
        for(int i=0;i<num;i++)
        {
            cin>>a;
            cout<<arr[a]<<endl; 
        }

    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/beautifulxu/article/details/80643023