題目連接:
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;
}