TOJ 1252
2013-12-16 21:05
465 查看
题目连接:
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
);
}
return 0;
}
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
);
}
return 0;
}
相关文章推荐
- TOJ 2199 A+B Problem的无奈 2006-07-21
- toj 2806 Replace Words
- toj 2483 Nasty Hacks
- toj 3505. Naughty Mike(树状数组)
- TOJ 2233.WTommy's Trouble【有向图的强联通分量】
- sicily 1252
- NDK 1252 不怕噩梦
- toj 2196. Nuanran's Idol II set练习
- TOJ-1153 将字符串中的每个单词中的字符逆转
- 怎么样解决Java中的Cp1252问题
- TOJ 1257 感受水题的力量
- poj 1252 Euro Efficiency 正负完全背包
- TOJ 1840 POJ 1127 HDU 1102 Jack Straws / 线段相交 + 并查集
- TOJ简单版贪吃蛇(bfs)
- TOJ题目分类demo
- TOJ 3407 Parenthesis
- TOJ 4267 An Easy Puz / 深搜
- TOJ 4287 ZOJ 3604 Tunnel Network / prufer序列
- TOJ 2882
- TOJ 2814