OneCoder Avatar
OneCodercoderli.com · 961 篇博文
三级

C++ 算法考级专栏

真题分析、矩阵探测、递归回溯与基础语法

🎨 视觉封面

【GESP】C++三级练习 luogu-p1420, 最长连号

📅 2025-01-27·✍️ OneCoder·计算中...·⏱️ 6 分钟
#GESP#C++#一维数组

GESP三级练习,一维数组、循环分支嵌套,难度★✮☆☆☆。

luogu-P1420 最长连号

题目要求

题目描述

输入长度为 nn 的一个正整数序列,要求输出序列中最长连号的长度。

连号指在序列中,从小到大的连续自然数。

输入格式

第一行,一个整数 nn

第二行,nn 个整数 aia_i,之间用空格隔开。

输出格式

一个数,最长连号的个数。

样例输入 #1

CONSOLE 2 行
10
1 5 6 2 3 4 5 6 8 9

样例输出 #1

CONSOLE 1 行
5

数据规模与约定

对于 100%100\% 的数据,保证 1n1041 \leq n \leq 10^41ai1091 \leq a_i \leq 10^9


题目分析

方法一

  1. 首先,读取输入的整数序列,存储在数组中。
  2. 初始化一个变量 max_serial_count 来存储最长连号的长度,初始值为 1。
  3. 遍历数组,使用一个内部循环来检查当前数是否是上一个数加 1,如果是,则增加当前连续数列的计数 cur_serial_count
  4. 如果不是,则重置 cur_serial_count 为 1。
  5. 更新 max_serial_count 为当前最大计数和 cur_serial_count 的最大值。
  6. 输出 max_serial_count 的值,即最长连号的长度。

方法二

  1. 首先,读取输入的整数序列,存储在数组中。
  2. 初始化一个变量 max_serial_count 来存储最长连号的长度,初始值为 1。
  3. 使用一个循环来遍历数组,从第二个数开始。
  4. 在循环中,检查当前数是否是下一个数减 1,如果是,则增加当前连续数列的计数 cur_serial_count
  5. 如果不是,则重置 cur_serial_count 为 1。
  6. 更新 max_serial_count 为当前最大计数和 cur_serial_count 的最大值。
  7. 从下一个位置继续检查即可,检查过的位置不用回溯,因此一层循环足以。
  8. 输出 max_serial_count 的值,即最长连号的长度。

示例代码

方法一代码

C++ 30 行
#include<iostream>
#include<cmath>
using namespace std;

int main() {
    int n; // 输入的整数
    cin >> n; // 读取输入的整数
    int a[n]; // 定义一个长度为n的数组
    for (int i = 0; i < n; i++) {
        cin >> a[i]; // 读取数组元素
    }
    int max_serial_count = 1; // 初始化最大连续数列计数
    for (int i = 0; i < n; i++) {
        int last_num = a[i]; // 初始化上一个数
        int cur_serial_count = 1; // 初始化当前连续数列计数
        for (int j = i + 1; j < n; j++) {
            if (a[j] == last_num + 1) {
                cur_serial_count++; // 如果当前数是上一个数加1,则计数增加

            } else {
                cur_serial_count = 1; // 如果不是,则重置计数

            }
            max_serial_count = max(max_serial_count, cur_serial_count); // 更新最大计数
            last_num = a[j]; // 更新上一个数
        }
    }
    cout << max_serial_count; // 输出最大连续数列计数
    return 0;
}

方法二代码

C++ 24 行
#include<iostream>
#include<cmath>
using namespace std;

int main() {
    int n; // 输入的整数
    cin >> n; // 读取输入的整数
    int a[n]; // 定义一个长度为n的数组
    for (int i = 0; i < n; i++) {
        cin >> a[i]; // 读取数组元素
    }
    int max_serial_count = 1; // 初始化最大连续数列计数
    int cur_count = 1; // 初始化当前连续数列计数
    for (int i = 0; i < n; i++) {
        if (a[i + 1] == a[i] + 1) {
            cur_count++; // 如果当前数是上一个数加1,则计数增加
        } else {
            max_serial_count = max(max_serial_count, cur_count); // 更新最大计数
            cur_count = 1; // 重置计数
        }
    }
    cout << max_serial_count; // 输出最大连续数列计数
    return 0;
}

💡 OneCoder 资源指引

所有代码开源上传至 GitHub:yummy-code 仓库 · GESP 专题站:GESP WIKI

🤝 技术交流与答疑

欢迎加入:C++ GESP/CSP 考级答疑群(688906745)Java/Python交流群(982860385),点击可直接加群。

📚

猜你想读 · 相关文章推荐

OneCoder

OneCoder (lihongzheshuai)

一个中年人的自留地,记录学习 C++、GESP/NOI、Java、Python 与算法架构的心得体会。本站唯一网址:coderli.com

读者讨论与留言

0 条讨论
✨ 支持点击留言直接回复 · Markdown 引用格式
💬 还没有读者留言,快来成为第一个讨论者吧!