折線分割平面
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 44771 Accepted Submission(s): 29584
Problem Description
我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。
Input
輸入數據的第一行是一個整數C,表示測試實例的個數,然後是C 行數據,每行包含一個整數n(0<n<=10000),表示折線的數量。
Output
對於每個測試實例,請輸出平面的最大分割數,每個實例的輸出佔一行。
Sample Input
2
1
2
Sample Output
2
7
/*遞推找規律:2*a*a - a + 1 */
#include<iostream>
using namespace std;
int main(){
int c , a;
cin >> c;
while ( c --){
cin >> a;
cout << 2*a*a - a + 1 << endl;
}
return 0 ;
}
直線的平面分割問題
- 當第n條直線分割前n-1塊平面時,f(n) = f(n-1) + k 。
- k 爲第n條直線切割後多出來的部分。
- 如果想要切出來最多的平面,第n條直線不能與其中任何直線的交點相交。
- 此時的第 n 條線被割裂分成兩條射線 和 n - 2 條線段。
- 而每條線段將所在的區域切割成兩塊,射線也將所在區域切割成兩塊。
- 也就是再原來的基礎上又產生了一塊。
- 所以 此時的 k = n-2 + 2 。
- 所以遞推公式爲 f(n) = f(n-1) + n; f(1) = 2; f(2) = 4;f(3) = 7…
- 前n項化簡得 f(n) = n*(n+1) / 2 + 1 。
折線的平面分割問題
- 折線得分割和上面的相仿。
- 首先列出公式f(n) = f(n-1) + k,然後分析k爲何值。
- 第 n 條折線產生了 2 * (n-1) 個交點。 2 條射線,22(n-1) 條線段,因爲一條折線等於兩條線段。
- 每多產生的線段在原有的區域上多割開了一塊區域。而折線的存在又多產生了一塊區域。
- 故 k =4 * (n-1) + 2 - 1 , 即 f(n) = f(n-1) + 4*(n-1) + 1;f(1) = 2;
- 化簡得 f(n) = 2 * n * n - n + 1 ;