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

来源:互联网 发布:linux zip文件压缩 编辑:程序博客网 时间:2024/05/06 17:02

折线分割平面

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部分,具体如下所示。
 

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

 

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

 

Sample Input
212
 

Sample Output
27
 

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;}


0 0
原创粉丝点击