【GESP】C++三级练习 luogu-B2097 最长平台
GESP C++三级练习,一维数组练习,难度★★☆☆☆。
luogu-B2097 最长平台
题目要求
题目描述
对于一个数组,其连续的相同段叫做一个平台,例如,在 $1$,$2$,$2$,$3$,$3$,$3$,$4$,$5$,$5$,$6$ 中 $1$,$2-2$,$3-3-3$,$4$,$5-5$,$6$ 都是平台。
编写一个程序,接收一个数组,找出最长的平台。在上面的例子中 $3-3-3$ 就是最长的平台。
输入格式
第一行有一个整数 $n$,为数组元素的个数。($1 \le n \le 100$)
第二行有 $n$ 个整数,整数之间以一个空格分开,整数 $k$ 范围($0<k<2000$)。
输出格式
输出最长平台的长度。
输入输出样例 #1
输入 #1
1
2
10
1 2 2 3 3 3 4 5 5 6
输出 #1
1
3
题目分析
解题思路
本题的解题思路如下:
- 问题本质:
- 找出数组中连续相同数字序列的最大长度
- 每个连续相同数字序列构成一个”平台”
- 解题关键:
- 遍历数组时,需要和前一个数字比较
- 用计数器记录当前平台长度
- 遇到不同数字时更新最大长度
- 实现思路:
- 使用三个变量:
- 当前平台计数器
- 最大平台长度
- 前一个数字
- 遍历时比较相邻数字:
- 相同则计数加1
- 不同则更新最大值并重置计数
- 使用三个变量:
- 复杂度分析:
- 时间复杂度:$O(n)$,仅需一次线性遍历
- 空间复杂度:$O(1)$,只使用了常数个变量,无需额外空间
示例代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<iostream>
#include<cmath>
int main() {
// 读取数组长度
int n;
std::cin >> n;
// count用于记录当前平台长度
int count = 0;
// max_n用于记录最长平台长度
int max_n = 0;
// last_num用于记录上一个数字,初始值-1表示还未读取任何数字
int last_num = -1;
// 循环读取n个数字
while (n--) {
// 读取当前数字
int cur_num;
std::cin >> cur_num;
// 如果是第一个数字
if (last_num == -1) {
last_num = cur_num;
count++;
continue;
}
// 如果当前数字与上一个数字相同,平台长度加1
if (cur_num == last_num) {
count++;
} else {
// 如果不同,更新最长平台长度
max_n = std::max(max_n, count);
// 重置last_num和count,开始新的平台计数
last_num = cur_num;
count = 1;
}
}
// 输出最长平台长度
std::cout << max_n;
return 0;
}
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP各级别考纲要点、知识拓展和练习题目清单详见C++学习项目主页
“luogu-”系列题目已加入洛谷Java、C++初学团队,作业清单,可在线评测,团队名额有限,欢迎加入。
“bcqm-”系列题目可在编程启蒙题库进行在线评测。
本文由作者按照 CC BY 4.0 进行授权