有一道折线分平面问题:http://acm.hdu.edu.cn/showproblem.php?pid=2050
在做这道题之前,先按照题目所说的先看下“直线分平面”的做法:
如图所示可以找到规律:假如当有n-1条直线时平面被分为f(n-1)个区域,要使第n条直线切成的区域数最多,那么第n条直线就必须与前n-1条直线相交且不能有同一交点,那么就会增加n-1个交点,多出(n-1+1)=(n)个平面。即f(n)=f(n-1)+n;然后用高中数列的累加法(把这条式子看做是an=a(n-1)+n就明白了)就可以求出f(n)=n(n+1)/2+1。
由直线分平面的解题步骤可知分出的平面的个数和交点有关。
从而类似的,折线分平面的规律为:假如当有n-1条折线时平面被分成f(n-1)个区域,要使第n条折线切成的区域数最多,那么第n条折线就必须与前n-1条折线相交,即与2*(n-1)条线段相交,新增的交点有4*(n-1)个,由图易知增加4(n-1)+1个平面。即f(n)=f(n-1)+4(n-1)+1;后用高中数列的累加法(把这条式子看做是an=a(n-1)+4(n-1)+1就明白了)就可以求出f(n)=2n^2-n+1;
解题代码如下:
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m;
scanf("%d",&m);
printf("%d\n",2*m*m-m+1);
}
return 0;
}
由折线分平面,在网上我又发现杭电acm题库还有道拓展到“平面分空间”的题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1290
相应的解题思路:从前两题的规律可知拓展到三维中所切成的区域数和交线有关。假如当有n-1个平面时分出来的控件数有f(n-1)个,要使第n个平面切下去时有最多的空间数,则第n个平面必须与前n-1个平面相交且不能有共同的交线,即增加n-1条交线,而这n-1条交线把第n个平面最多分成g(n-1)个区域(g(n)为直线分平面的f(n),即g(n)=n(n+1)/2+1,这里有点难理解,画个图或者空间想象一下)。即f(n)=f(n-1)+g(n-1),接着可求出f(n)=(n^3+5n)/6+1;
解题代码如下:
#include<stdio.h>
int main()
{
int m;
while(scanf("%d",&m)!=EOF)
{
printf("%d\n",(m*m*m+5*m)/6+1);
}
return 0;
}
总结,有时候不要盲目做题,找规律便能解决,还有发现数学能力较差还是比较吃亏的。。。