题目连接:
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;
}