综合实践·信息术编程之一题多解.pptVIP

  • 5
  • 0
  • 约1.37千字
  • 约 13页
  • 2018-06-24 发布于江苏
  • 举报
综合实践·信息术编程之一题多解

By 七(8)班 陈 硕 By 七(8)班 陈 硕 综合实践·信息技术编程之 一题多解 积木块数问题 解题报告 积木块数 【问题描述】 安安、庆庆和可可用一些相同正方体积木搭起如图所示积木塔,他们想知道搭建这样的积木塔一共用了多少块积木。给定积木塔的层数,请你帮助他们计算该积木塔共有多少块积木。 【输入描述】 一个整数N,表示积木塔的层数。 【输出描述】 一个整数X,表示整个积木塔所用的积木数。 【输入样例】 5 【输出样例】 35 【数据范围】 1=N=2000 对于这一道题 我想说:这是多么 的题目啊! 这完全是CCF典型的“第一题”。 (PS:呵呵。。。。。。) 此问题的核心就是: (“所谓的”)方法一: 看图形,可得以下规律: 我们有了一个“惊人”的发现: 第i行比第i-1行多i个方块。这样一来,我们就可以简单地解决这个问题了。 算法: 根据上一行的块数加这一行的行数,然后逐层累加。 时间效率:O(n)级别 贴上程序: #includeiostream #includecstdio #includecstdlib using namespace std; long long n,i,s,ans; int main() { cinn; for (i=1; i=n; i++) { s+=i;ans+=s; } coutans; system(pause); return 0; } 方法二: 对方法一的另一种思考: 方法一中每一层的块数通过上一层求得的,但是,通过观察,稍加思考,我们就可以发现: 每一行的层数的变化是等差的,那么我们可以通过等差数列的求和公式求得每一层的块数。 时间效率:O(n)级别 再次贴程序: #includeiostream #includecstdio #includecstdlib using namespace std; long long n,i,s,ans; int main() { cinn; for (i=1; i=n; i++) { s=(1+i)*i/2; ans+=s; } coutans; system(pause); return 0; } 方法三: 同样的是对方法一的另一种思考: 通过上一层求出本层,这显而易见是一种递推的过程。 所以我们可以通过递推求解。 时间效率:O(n)级别 最后一次贴上代码: #includeiostream #includecstdio #includecstdlib using namespace std; long long n,i,f[100000000],ans; int main() { cinn; for (i=1; i=n; i++) f[i]=f[i-1]+i; for (i=1; i=n; i++) ans+=f[i]; coutans; system(pause); return 0; } * * … 15 10 6 3 1 块数 … 5 4 3 2 1 层数 这就是我对这道题的理解 欢迎大家来补充自己的理解。

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档