【GESP】C++二级练习 luogu-B3735 [信息与未来 2018] 圣诞树
GESP二级练习,一道数学小题,难度★☆☆☆☆。
luogu-B3735 [信息与未来 2018] 圣诞树
题目要求
题目描述
圣诞树共有 $n$ 层,从上向下数第 $1$ 层有 $1$ 个星星、第 $2$ 层有 $2$ 个星星、以此类推,排列成下图所示的形状。
星星和星星之间用绳子连接。第 $1,2,\cdots, n - 1$ 层的每个星星都向下一层最近的两个星星连一段绳子,最后一层的相邻星星之间连一段绳子。
你能算出如果要布置一棵很大($n$ 层)的圣诞树,需要买多少段绳子吗?
输入格式
输入一行一个整数 $n$,圣诞树的层数。
输出格式
输出一行一个整数,代表圣诞树中绳子的段数。
输入 #1
1
2
输出 #1
1
3
输入 #2
1
4
输出 #2
1
15
数据规模
所有数据满足 $1 ≤ n ≤ 10^3$。
本题原始满分为 $15\text{pts}$。
题目分析
解题思路
绳子由两部分构成:垂直连接(每层星星向下一层连接)和水平连接(最后一层相邻星星之间的连接)。
- 读入圣诞树的层数 $n$。
- 特判:若 $n=1$,只有一个星星,不需要绳子,答案为 $0$。
- 否则,分别计算两部分绳子数并求和:
- 垂直连接:第 $i$ 层($1 \le i \le n-1$)每个星星向下连 $2$ 根绳子,第 $i$ 层有 $i$ 个星星,故垂直绳子总数为 $\sum_{i=1}^{n-1} 2i = (2 + (n-1) \times 2) \times (n-1) / 2$。
- 水平连接:最后一层有 $n$ 个星星,相邻连接需要 $n-1$ 根绳子。
- 总绳子数 $= (2 + (n-1) \times 2) \times (n-1) / 2 + (n-1)$。
- 输出结果。
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <iostream>
using namespace std;
int main() {
// 定义变量n用于存储圣诞树的层数
int n;
// 从标准输入读取层数
cin >> n;
// 定义变量ans用于存储所需绳子的总段数
int ans = 0;
// 如果只有一层,不需要绳子
if (n == 1) {
ans = 0;
} else {
// 计算所需绳子总段数
// 每层向下连接的绳子数:(2 + (n-1)*2)*(n-1)/2
// 最后一层相邻星星之间的绳子数:(n-1)
ans = (2 + (n - 1) * 2) * (n - 1) / 2 + (n - 1);
}
// 输出结果
cout << ans;
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
"luogu-"系列题目可在洛谷题库进行在线评测。
"bcqm-"系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助
本文由作者按照 CC BY-NC-SA 4.0 进行授权

