题目:F - 折线分割平面
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。 (图在https://cn.vjudge.net/contest...)
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
Sample Input
2
1
2
Sample Output
2
7
新技巧:在进行思路总结前,先把一个所需要了解到的数学知识说一下;
就是关于直线分割平面的知识,1条直线将一个平面分割成两个平面,n-1条直线如果有f[n-1]个平面,那么第n条直线如果想要使得其截面最大,则要让这个第n条直线与所有的n-1条直线都有一个新的交点,所有这样以来,这个第n条直线就会被分割成n-2个线段和2个射线,又因为每一个新的线段和射线都会将原来一个平面分成两个,所有新增加的平面的数量为n-2+2个;
同理:对于折线的问题时,则n-1个折线有f[n-1]个平面,则先将第n个的一条直线进行切割,则得到2(n-2)个线段与两条射线,当折线的第二条直线进行切割时同样的是2(n-1)个线段(这个原因是因为提前进去了一条折线里的直线,所有直线个数变成了n条了)和两条射线,但因为两个直线是由折线拆出来的,所有射线会减少两个,线段会增加两个;所有最终结果为4*(n-1)个线段和两条射线,由直线切割平面时增加平面的结论,则新增加的平面就是产生的线段与射线之和,又因为折线合在一块的地方分割的平面会减少一个;所有最后结果
即为f[n]=f[n-1]+4*(n-1)+2-1;
思路:这个题目就是利用上面那个数学结论,进而进行递推公式;然后提前存到数组中;(记得用long long);到时候直接调用即可;
代码:
#include<stdio.h>
long long a[10005];
int main()
{
int n,t,i;
a[1]=2;
for(int x=2;x<=10000;++x)
a[x]=a[x-1]+4*(x-1)+1;
scanf("%d",&t);
for(i=0;i<t;++i){
scanf("%d",&n);
printf("%lld\n",a[n]);
}
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。