1. 程式人生 > >[hdu-2050] 折線分割平面

[hdu-2050] 折線分割平面

折線分割平面

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15796    Accepted Submission(s): 10897

Problem Description 我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。

Input 輸入資料的第一行是一個整數C,表示測試例項的個數,然後是C 行資料,每行包含一個整數n(0<n<=10000),表示折線的數量。


Output 對於每個測試例項,請輸出平面的最大分割數,每個例項的輸出佔一行。


Sample Input 2 1 2
Sample Output 2 7

分析:遞推題

1、我們先來看看增加直線的情況:

                              

不新增直線時,只有 1 個面;新增一條直線時,有 2 個面; 新增兩條直線時,有 4 個面;再往後新增直線時,為使分隔面儘可能的多,則第 n 條直線需與前 n - 1 條直線相交且不存在三線或三線以上交於一點的情況。這樣的話,在平面中,增加第 n 條直線就會增加 n - 1 個交點。也不難發現,平面中增加 i 個點就會增加 i + 1 個面。所以 n 條直線分割平面最大數是1 + 1 + 2 + 3 + ... + n = (n2 + n + 2) / 2

2、我們再來看看增加平行線的情況:

          

                    

一組平行線都不新增時,只有 1 個面;新增一組平行線時,有 3 個面;新增兩組平行線時,有 9 個面;再往後新增平行線時,和上述新增直線情況類似。當第 n 次新增平行線時,前面已經有 2 * ( n - 1) 條直線了,所以第 n 組平行線,即 2n - 1 條和第 2n 條直線新增進去的時候,各增加了 2 * ( n - 1) 個點,也就是增加了 2 * ( n - 1) + 1 個面。所以第 n 次新增平行線增加的總面數是 2 * [ 2 * ( n - 1) + 1 ] = 4 * n - 2 .所以 n 組平行線分隔的總面數是 1 + ( 3 + 4 * 1 - 2 ) + ( 3+ 4 * 1 - 2 + 4 * 2 - 2 ) + …… + ( 3+ 4 * 1 - 2 + 4 * 2 - 2 + …… + 4 * n -2 ) = 2 * n2

+ 1 .

3、我們再來看看本題增加折線的情況:

          

平行線的一端相交就成了折線,相交後,有兩個面就會合為一個面,所以 n 組平行線變成折線以後,就會減少 n 個面。所以本題 n 條折線就分割出 2 * n2 - n + 1 個面。

import java.util.Scanner;

public class Main {

	static int[] nums = new int[10001];

	static {
		for (int i = 0; i < 10001; i++) {
			nums[i] = 2 * i * i - i + 1;
		}
	}

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int c = scanner.nextInt();

		while (c-- != 0) {
			int n = scanner.nextInt();

			System.out.println(nums[n]);
		}
	}
}