杭电oj2050——折线分割平面

我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值