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條相交的直線最多能把平面分割成多少塊
當添加第N條只顯示,爲了使平面最多, 則第N條直線要與前面的N-1條直線都相交,且沒有任何三條直線教育一個點。
則第N條直線有N-1個交點。由於每增加N個交點,就增加N+1個平面,所以用N條直線來分隔平面,最多的數是1+1+2+3+…+n=1+n*(n+1)/2;
再看每次增加兩條相互平行的直線
當第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
如果把每次加進來的平行邊讓它們一頭相交
則平面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;
}