问题来源:Problem - 2050
Problem Description
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
Sample Input
2
1
2
Sample Output
2
7
思路分析:
折线的情况看起来比较复杂,我们先从直线分隔平面来入手。
假设有n条线时,分隔的平面数量为F(n)
假设原本只有一条直线,把平面分成了两个部分。
当加入第二条直线时,与原来的一条直线最多有1个交点,平面多出了2个部分;
当加入第三条直线时,与原来的两条直线最多有2个交点,平面多出了3个部分;
当加入第四条直线时,与原来的三条直线最多有3个交点,平面多出了4个部分;
……
综上,当加入第n条直线时,与原来的(n-1)直线最多有(n-1)个交点,平面就多出了(n-1)+1【交点数+1】个部分,分隔的平面数量为F(n)=F(n-1)+(n-1)+1
同理,用于折线分隔平面的情况。
两个折线之间最多有4个交点,因此在加入第n条折线时,与原来的(n-1)条折线最多有4*(n-1)个交点,平面就会多出4*(n-1)+1个部分。
故,推导出,分隔的平面数量F(n)的递归公式为:
代码如下:
import java.util.Scanner;
public class Test_2050 {
public static void main (String args[]) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
long a[] = new long[10001];
a[1] = 2;
a[2] = 7;
while(n -- != 0) {
int c = in.nextInt();
for(int i=3;i<=c;i++) {
a[i] = a[i-1] + 4 * (i - 1) +1;
}
System.out.println(a[c]);
}
}
}