折线分隔平面

问题来源: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)的递归公式为:F(N)=F(N-1)+4*(n-1)+1

代码如下:

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]);

}

}

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容