折线分割平面
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Submission(s) : 42 Accepted Submission(s) : 14Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
![](http://acm.hdu.edu.cn/data/images/C40-1008-1.jpg)
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
Sample Input
2
1
2
Sample Output
2
7
Author
lcy
Source
递推求解专题练习(For Beginner)
直线:
|
条数
| 最多交点数
| 平面数
|
1
| 0
| 2
|
2
| 1
| f(1)+2
|
3
| 2
| f(2)+3
|
4
| 3
| f(3)+4
|
n
| n-1(该条数的直线前面的直线总条数)
| f(n-1)+增加的平面数=f(n-1)++(交点数+1)=f(n-1)+((n-1)+1)
|
平行线:
|
对数
| 条数
| 最多交点数
| 平面数
|
1
| 2
| 0
| 3
|
2
| 4
| 4=2*2
| f(1)+6=f(1)+3*2
|
3
| 6
| 8=4*2
| f(2)+10=f(2)+5*2
|
4
| 8
| 12=6*2
| f(3)+14=f(3)+7*2
|
n
| 2*n
| 单条直线交点数*2=该对平行线前的直线总条数*2=(2*(n-1))*2
| f(n-1)+单条直线增加的平面数*2=f(n-1)+(交点数+1)*2=f(n-1)+(2*(n-1)+1)*2
|
折线:
|
折线数
| 所含直线数
| 最多交点数
| 平面数
|
1
| 2
| 0
| 2
|
2
| 4
| 4=2*2
| f(1)+5=f(1)+(2*3-1)
|
3
| 6
| 8=4*2
| f(2)+9=f(2)+(2*5-1)
|
4
| 8
| 12=6*2
| f(3)+13=f(3)+(2*7-1)
|
n
| 2*n
| 单条直线交点数*2=该对平行线前的直线总条数*2=(2*(n-1))*2
| f(n-1)+(单条直线增加的平面数*2-1)=f(n-1)+((交点数+1)*2-1)=f(n-1)+((2*(n-1)+1)*2-1)
|
三角形
|
个数
| 交点数
| 增加的平面个数
| 分割平面总数
|
1
| 0
| 1
| 2
|
2
| 2*3
| 3*3-3
| f(1)+3*3-3
|
3
| 4*3
| 5*3-3
| f(2)+5*3-3
|
4
| 6*3
| 7*3-3
| f(3)+7*3-3
|
n
| (n*2-2)*3
| (2*n-1)*3-3
| f(n-1)+(2*n-1)*3-3=f(n-1)+6*(n-1)
|
#include <stdio.h>
int main()
{
int N,n,i,j;
__int64 f[10001];
f[1]=2;
for(i=2;i<10001;i++)
{
f[i]=f[i-1]+4*(i-1)+1;
}
while (scanf("%d",&N)!=EOF)
{
for(j=0;j<N;j++)
{
scanf("%d",&n);
printf("%I64d\n",f
);
}
}
return 0;
}