对于直线分割平面的情况:
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; }