文章

【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. 问题本质:
    • 找出数组中连续相同数字序列的最大长度
    • 每个连续相同数字序列构成一个”平台”
  2. 解题关键:
    • 遍历数组时,需要和前一个数字比较
    • 用计数器记录当前平台长度
    • 遇到不同数字时更新最大长度
  3. 实现思路:
    • 使用三个变量:
      • 当前平台计数器
      • 最大平台长度
      • 前一个数字
    • 遍历时比较相邻数字:
      • 相同则计数加1
      • 不同则更新最大值并重置计数
  4. 复杂度分析:
    • 时间复杂度:$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 进行授权