計算幾何-17級暑期集訓(直線分割平面&&折線分割平面)

I - 折線分割平面

 https://cn.vjudge.net/contest/241309#problem/I

我們看到過很多直線分割平面的題目,今天的這個題目稍微有些變化,我們要求的是n條折線分割平面的最大數目。比如,一條折線可以將平面分成兩部分,兩條折線最多可以將平面分成7部分,具體如下所示。 

Input

輸入數據的第一行是一個整數C,表示測試實例的個數,然後是C 行數據,每行包含一個整數n(0<n<=10000),表示折線的數量。 
 

Output

對於每個測試實例,請輸出平面的最大分割數,每個實例的輸出佔一行。 
 

Sample Input

2
1
2

Sample Output

2
7

分析:

先看N條相交的直線最多能把平面分割成多少塊

杭電acm2050 <wbr>折線分割平面

當添加第N條只顯示,爲了使平面最多, 則第N條直線要與前面的N-1條直線都相交,且沒有任何三條直線教育一個點。

則第N條直線有N-1個交點。由於每增加N個交點,就增加N+1個平面,所以用N條直線來分隔平面,最多的數是1+1+2+3+…+n=1+n*(n+1)/2;

 

再看每次增加兩條相互平行的直線

  杭電acm2050 <wbr>折線分割平面
 

 

當第N次添加時,前面已經有2N-2條直線了,所以第N次添加時,第2N-1條直線和第2N條直線都各能增加2*(n-1)+1 個平面。

所以第N次添加增加的面數是2[2(n-1) + 1] = 4n - 2 個。因此,總面數應該是

1 + 4n(n+1)/2 - 2n = 2n2 + 1 

 

如果把每次加進來的平行邊讓它們一頭相交

杭電acm2050 <wbr>折線分割平面

則平面1、3已經合爲一個面,因此,每一組平行線相交後,就會較少一個面,

所以所求就是平行線分割平面數減去N,爲2n^2 -n + 1

利用上述總結公式f(n)=2n^2 -n + 1

#include<stdio.h>

int main()

{

int T,n;

scanf("%d",&T);

while(T--&&scanf("%d",&n)!=EOF)

printf("%d\n",2*n*n-n+1);

return 0;

}

或者利用公式f(n)=f(n-1)+4*(n-1)+1

#include<stdio.h>

int main()

{

__int64 s[10001]; 

    int i,T,n;

scanf("%d",&T);

while(T--)

{

s[0]=1;

scanf("%d",&n);

for(i=1;i<=n;i++)

s[i]=s[i-1]+4*(i-1)+1;

printf("%I64d\n",s[i-1]);

}

return 0;

}

我的代碼:

#include <stdio.h>
int main()
{
	int t,n;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		printf("%d\n",2*n*n-n+1);
	}
	return 0;
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章