我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
提示思路:1.先分析直线分割平面的情况,增加第n条直线的时候,跟之前的直线最多有n-1个交点,此时分出的部分多了(n-1)+1,即n个部分(可以自己画图检验!!!)。
总之:添加直线后,增加的部分数为增加的交点数加1.
2.折线也是同理,我们先画图,发现当n=1(n为直线的条数)时,分出的部分为2,此时图中有0个交点,记在添加第一条直线前的整个平面为1个部分, 那么n=1时增加了0个顶点就增加了 0+1 个面,即分出的部分为1+1=2。
当n=2时,最多增加4个交点,则此时增加了4+1个部分,此时总共有5+2=7个部分。
当n=3时,最多增加8个交点,则此时增加了8+1个部分,此时总共9+7=16个部分;
综上,我们发现当有m条折线的时候,我们可以把它们看成2m个射线,当再添加一条折线的时候(因为这条折线也可以看成是两个射线),最多就会增加22m个交点。
所以得出递推式,当添加第n条折线的时候,最多增加的交点数为22(n-1)个,所以增加的部分个数为22(n-1) + 1;
即:f(n) = f(n-1) + 22(n-1) + 1.
代码:
#include <stdio.h>
int main()
{
__int64 parts[10001] = {1, 2, 7};
int c, n, i;
for(i = 3; i <=10000; i++)
parts[i] = parts[i-1] + 2*2*(i-1) + 1;
scanf("%d", &c);
while(c--)
{
scanf("%d", &n);
printf("%I64d\n", parts[n]);
}
return 0;
}