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;
}


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