【杭电oj】2050 - 折线分割平面(递推)

折线分割平面

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


Problem Description
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
【杭电oj】2050 - 折线分割平面(递推)_第1张图片
 

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

 

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

 

Sample Input
   
   
   
   
2 1 2
 

Sample Output
   
   
   
   
2 7
 

Author
lcy
 

Source
递推求解专题练习(For Beginner)


这道题其实我一直很惧怕的,总是退不出规律,今天周赛,没办法,硬着头皮去推了,没想到真的做出来了。

说一下推理思路:如果想切割出最多的地域,就要和最多的线切割,每次切割总要制造两条线,则第n次切得时候,场上有 2*(n-1) 条线,与这些线每相交一次,就新形成了2*(n-1)个面,第n次切割时又是两条线去切,则新形成4*(n-1),但是这两条线是连起来的,也就是说把他们连起来的那条线还要额外再形成一个平面,所以新形成的平面的个数为:4*(n-1)+1。这个数加上之前形成的数,就得出了结果。

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
	long long num[11111];
	num[1] = 2;
	for (int i=2;i<=10000;i++)
		num[i] = num[i-1] + 4*i - 3;
	int u;
	int n;
	scanf ("%d",&u);
	while (u--)
	{
		scanf ("%d",&n);
		printf ("%lld\n",num[n]);
	}
	return 0;
}


你可能感兴趣的:(【杭电oj】2050 - 折线分割平面(递推))