Hdu 2050 折线分割平面
题目
Problem Description
我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。
Input
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C 行数据,每行包含一个整数n(0<n<=10000),表示折线的数量。
Output
对于每个测试实例,请输出平面的最大分割数,每个实例的输出占一行
Sample Input
2
1
2
Sample Output
2
7
分析
① 首先题意中的折线是由两根线段组成的,只不过只有一段是无限伸长的,所以我们可以通过求出直线分割平面f(n)
函数从而推导出折线的递推公式。
② 直线分割平面:
1条直线可以将1个平面划分为2个平面,两条直线的情况下只有相交才能分割出最大的平面数,即为4个平面,此时交点数为1,以此类推,可以发现,当画第n条直线时,它可以与前面n-1条直线形成n-1个交点,可以使平面数多出(n-1)+1=n。
如图:
通过拆分可得
n=1 ··· ··· 2=1+1;
n=2 ··· ··· 4=1+1+2;
n=3 ··· ··· 7=1+1+2+3;
n=4 ··· ··· 11=1+1+2+3+4;
n=5 ··· ··· 15=1+1+2+3+4+5;
可以得出直线分割平面递推公式,f(n)=f(n-1)+新增交点个数+1;
即f(n) = f(n-1)+n;
③ 折线分割平面:
通过题意可知,每新增一条折线,就相当于多出两条起点一样终点不同的射线,所以可以推出每多一条折线,就会多4*(n-1)个交点,根据直线分割平面交点与平面的关系可知:每多一条折线,就会多出4*(n-1)+1个平面;由此,推出折线分割平面的递推式:f [n] = f [n-1] +4*(n-1)+1
④得到递推式了,代码就不难写出了,这里采用打表的方法求出最终结果。
代码
#include <stdio.h>
int main() {
int c,i;
scanf("%d",&c);
long long a[10000]={1,2,7};
for(i=3;i<=10000;i++){
a[i]=a[i-1] + 4*(i-1)+1; //每新增一条折线,就多4*(n-1)个交点, 那么就多(交点数)+1个平面
}
while(c--){
int n;
scanf("%d",&n);
printf("%d\n", a[n]);
}
return 0;
}
图片来源:https://www.cnblogs.com/cafu-chino/p/10139083.html