首页 > 代码库 > 杭电 2050

杭电 2050

折线分割平面

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
212
 

Sample Output
27
 

Author
lcy
 

Source
递推求解专题练习(For Beginner)
 
 
这道题可以看成是数学题 也可以看成事递推题 当然 递推题也属于数学题
利用数学知识 因为当第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]);
 }
}