TOJ 1252


題目連接:

http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=1252


題目類型:

數學題


數據結構:


思路分析:

從各個頂點開始推導

從n=1開始

只有一個三角形

從第n=2層開始,

在第一層有一個頂點,代表一整個大的三角形,

第二層有2個頂點,代表2個小三角形.

第二層底部,分別有1個三角形可以形成一個倒三角形



顯然 正着來看,每一層的頂點數符合 公差是1的等差數列, 

所以 n-1 到 n層的時候 新的三角形 有 ( n + 1 ) * n / 2 個

加回上一層的所有三角形

得到公式就是

f(n) = f(n - 1) +  ( n + 1 ) * n / 2 

那第n層的時候 新增的 倒三角形有多少?

倒三角形的頂點主要是看最底的邊上的可形成三角形的頂點

就是除去最左最右頂點的其餘頂點.

所以

可用頂點就是 n - 2

當然, 有些點是好幾個三角形的共有三角形點,

比如 n = 5 的時候

底邊有 5 + 1 = 6 個點

其中, 可形成倒三角型的有 6 - 2 = 4 個頂點

這4個頂點中, 有4個是 只有1層的小三角形

2個頂點可以形成 2層的三角型

經過泛化.

可以得出 這依然是個等差數列

如果n層有 偶數個 可用頂點, 那麼是 從 ( n + 1 - 2 )  到 2 個點 公差爲2 的 等差數列求和

如果n層有 奇數個 可用頂點, 那麼是 從 ( n + 1 - 2 )  到 1 個點 公差爲2 的 等差數列求和

寫成公式就是 :

rlt[1] = 1;

rlt[i] = rlt[i - 1] + ( ( i + i * i ) / 2 + ( ( ( i - 1 ) + ( ( i + 1 ) % 2 == 0 ? 2 : 1 ) ) * ( i / 2 ) ) / 2 );


證明:


源代碼:

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
	__int64 i, n, rlt[505];
	
	rlt[1] = 1;
	
	for( i = 2; i <= 501; i ++ )
	{
		rlt[i] = rlt[i - 1] + ( ( i + i * i ) / 2 + ( ( ( i - 1 ) + ( ( i + 1 ) % 2 == 0 ? 2 : 1 ) ) * ( i / 2 ) ) / 2 );
	}
	
	
	while( scanf( "%I64d", &n ) != EOF )
	{
		printf( "%I64d\n", rlt[n] );
	}
	
	return 0;
}


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