折线分割平面
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16486 Accepted Submission(s): 11365
Problem Description
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
Sample Input
2 1 2
Sample Output
2 7
Author
lcy
Source
这道题可以看成是数学题 也可以看成事递推题 当然 递推题也属于数学题
利用数学知识 因为当第N条直线 他与前面的N-1条直线都有交点,因此形成了 N+1个平面
即 :第N条直线 增加了 N+1个平面 则总共形成的平面总数是 1+1+2+3+4+...+n=1+n*(n+1)/2;
要是N*2条平行线相交,则当最后一对平行线与其他直线相交的时候,n*2-1条直线与n*2条直线 都增加了
2*(n-1)+1那么第N对直线的时候,就是增加了2*(2*(n-1)+1)个平面即 4n-2个平面
则总共形成的平面式1+4n(n+1)/2-2n=2n^2+1;因为题上的是n条折线 故可将平行线头部相交 则平面数减少了一个
那么n条折线形成的最大面数是2n^2-n+1;
代码如下:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m;
scanf("%d",&m);
printf("%d\n",2*m*m-m+1);
}
return 0;
}
当然也可以不必推导出来后来的公式
根据中间推导出来的 递推公式也能求解
代码如下 只是要用————int64型数据
#include<stdio.h>
__int64 a[10010];
int main()
{
int n,i,m;
a[0]=1;
a[1]=2;
for(i=1;i<10010;i++)
a[i]=a[i-1]+4*(i-1)+1;
scanf("%d",&n);
while(n--)
{
scanf("%d",&m);
printf("%I64d\n",a[m]);
}
}
杭电 2050