luogu-B2097 最长平台

luogu-B2097 最长平台

GESP C++三级练习,一维数组练习,难度★★☆☆☆。

luogu-B2097 最长平台

题目要求

题目描述

对于一个数组,其连续的相同段叫做一个平台,例如,在 1122223333334455556611222-23333-3-344555-566 都是平台。

编写一个程序,接收一个数组,找出最长的平台。在上面的例子中 3333-3-3 就是最长的平台。

输入格式

第一行有一个整数 nn,为数组元素的个数。(1n1001 \le n \le 100

第二行有 nn 个整数,整数之间以一个空格分开,整数 kk 范围(0<k<20000<k<2000)。

输出格式

输出最长平台的长度。

输入输出样例 #1

输入 #1

10
1 2 2 3 3 3 4 5 5 6

输出 #1

3

题目分析

解题思路

本题的解题思路如下:

  1. 问题本质:

    • 找出数组中连续相同数字序列的最大长度
    • 每个连续相同数字序列构成一个"平台"
  2. 解题关键:

    • 遍历数组时,需要和前一个数字比较
    • 用计数器记录当前平台长度
    • 遇到不同数字时更新最大长度
  3. 实现思路:

    • 使用三个变量:
      • 当前平台计数器
      • 最大平台长度
      • 前一个数字
    • 遍历时比较相邻数字:
      • 相同则计数加1
      • 不同则更新最大值并重置计数
  4. 复杂度分析:

    • 时间复杂度:O(n)O(n),仅需一次线性遍历
    • 空间复杂度:O(1)O(1),只使用了常数个变量,无需额外空间

{% include custom/custom-post-content-inner.html %}


示例代码

#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;
}

{% include custom/custom-post-content-footer.md %}

所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code

luogu-”系列题目可在 洛谷题库 在线评测。

bcqm-”系列题目可在 编程启蒙题库 在线评测。

GESP/CSP 认证学习微信公众号
GESP/CSP 认证学习微信公众号
Last updated on