1.OJ 2050 拆线分割平面
(http://acm.hdu.edu.cn/showproblem.php?pid=2050)
Problem Description
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行。
Sample Input
2
1
2
Sample Output
2
7
2.遇到的问题:
看到这个问题,又是统计规律,试着去画一下3条折线的情况,算一下结果是后又于一直算错达到了束手无策的境地,后面得知正确答案是16。这方面我是知识盲区,对复杂一点的规律没有一点办法。于是就去百度找了找相关的原理相关规律。
3.解决:
首先是直线拆分平面的原理,那个很好理解:
当添加第N条,为了使平面最多, 则第N条直线要与前面的N-1条直线都相交,且没有任何三条直线相交一个点。
则添加第N条直线会多N-1个交点。由于每增加N个交点,就增加N+1个平面,所以添加第N条直线来会在之前的基础上增加N个平面,用F[i]表示i条直线能把平面切分成的个数。
F[1]=2;
F[n]=F[n-1]+n;
递推的F[n]=1+n*(n+1)/2
后来根据已经做过这题的组员的引导和上面的直线拆分平面的公式,把目光放在了他们的交点上面,突然豁然开朗。
然后上升到折线层面:
从图中可以看到,每多出一条折线,都会多出4(n-1)个交点,也就是说会多出4(n-1)+1个平面,那么我们可以得到递推式: f [n] = f [n-1] +4(n-1)+1
最后化简得出:f [n]=2n*n-n+1
类似的,关于Z形线分割平面也是一样的道理:
其实这个跟前两个思路也一样,找出每次画一个Z形线会多出来几个交点。画完图后很清楚可以看到,每次多9个;
也就是说,递推式可以写成: f [n] = f [n-1]+9* (n-1) +1
4.由此根据公式解决了问题:
#include<stdio.h>
int main(){
int c,n;
scanf("%d",&c);
while(c--){
scanf("%d",&n);
printf("%d\n",2*n*n-n+1);
}
}
5.总结:多从细微的角度看问题,要学会去猜想,不要老是想蛮力解决。