首页 > 代码库 > 1412201059-hd-折线分割平面

1412201059-hd-折线分割平面

折线分割平面

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 18059    Accepted Submission(s): 12420


Problem Description
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
技术分享
 

Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。

 

Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。

 

Sample Input
2 1 2
 

Sample Output
2 7
 解题思路
        可将每个折线看成是两条直线,但是少了一半。因此每一条折线比两条直线分割的面的部分少2。因此n条折线比2n条直线分割平面形成的部分少2n。
初始代码
#include<stdio.h>
int a[21000];
int main()
{
	int t,n;
	int i,j,k;
	a[1]=2;
	a[2]=4;//a[2]=a[1]+2=a[2-1]+2
	a[3]=7;//a[3]=a[2]+3=a[3-1]+3
	for(i=4;i<=20000;i++)
	    a[i]=a[i-1]+i;
	/*可将每个折线看成是两条直线,但是少了一半。
      因此每一条折线比两条直线分割的面的部分少2。
	  因此n条折线比2n条直线分割平面形成的部分少2n。*/
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		printf("%d\n",a[2*n]-2*n);
	}
	return 0;
}
优化:
        因为a[i]=a[i-1]+i;
               a[i-1]=a[i-2]+i-1;
               a[i-2]=a[i-3]+i-2;
               ...
               a[i-(i-2)]=a[i-(i-2)-1]+i-(i-2);
               a[i]=a[i-(i-2)-1]+2+...+i;
               a[i]=a[1]+2+...+i;
        又因为a[1]=2;
               a[i]=2+2+...+i;
               a[i]=1+1+2+...+i;
               a[i]=1+(i+1)*i/2;
        所以f(n)=(1+2*n)*2*n/2+1-2*n
                     =2*n*n-n+1;
优化后代码:
#include<stdio.h>
int main()
{
	int t,n;
	int i,j;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		printf("%d\n",2*n*n-n+1);
	}
	return 0;
}



1412201059-hd-折线分割平面