GESP认证C++编程真题解析 | B4416 [GESP202509 四级] 最长连续段
欢迎大家订阅我的CSDN专栏:算法题解:C++与Python实现!
本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战!
专栏特色
1.经典算法练习:根据信息学竞赛大纲,精心挑选经典算法题目,提供清晰的代码实现与详细指导,帮助您夯实算法基础。
2.系统化学习路径:按照算法类别和难度分级,从基础到进阶,循序渐进,帮助您全面提升编程能力与算法思维。
适合人群:
- 准备参加蓝桥杯、GESP、CSP-J、CSP-S等信息学竞赛的学生
- 希望系统学习C++/Python编程的初学者
- 想要提升算法与编程能力的编程爱好者
附上汇总帖:GESP认证C++编程真题解析 | 汇总
【题目来源】
洛谷:[B4416 GESP202509 四级] 最长连续段 - 洛谷
【题目描述】
对于 $k$ 个整数构成的数组 $[b_1,b_2,…,b_k]$,如果对 $1≤i$$<$$k$ 都有 $b_{i+1}$$=$$b_{i+1}$,那么称数组 $b$ 是一个连续段。
给定由 $n$ 个整数构成的数组 $[a_1,a_2,…,a_n]$,你可以任意重排数组 $a$ 中元素顺序。请问在重排顺序之后,$a$ 所有是连续段的子数组中,最长的子数组长度是多少?
例如,对于数组 $[1,0,2,4]$,可以将其重排为 $[4,0,1,2]$,有以下 $10$ 个子数组:
$[4],[0],[1],[2],[4,0],[0,1],[1,2],[4,0,1],[0,1,2],[4,0,1,2]$其中除 $[4,0],[4,0,1],[4,0,1,2]$ 以外的子数组均是连续段,因此是连续段的子数组中,最长子数组长度为 $3$。
【输入】
第一行,一个正整数 $n$,表示数组长度。
第二行,$n$ 个整数 $a_1,a_2,…,a_n$,表示数组中的整数。
【输出】
一行,一个整数,表示数组 $a$ 重排顺序后,所有是连续段的子数组的最长长度。
【输入样例】
4
1 0 2 4
【输出样例】
3
【算法标签】
《洛谷 B4416 最长连续段》 #离散化# #排序# #GESP# #2025#
【代码详解】
#include <bits/stdc++.h>
using namespace std;
const int N = 100005; // 定义数组最大长度
int n; // 输入数字的个数
int cur = 0; // 记录去重后的数字个数
int maxn = 0; // 存储最长连续序列的长度
int a[N]; // 存储去重后的数字
map<int, int> mp; // 哈希表,用于判断数字是否重复
int main()
{
// 输入数字个数
cin >> n;
// 输入数字并去重
for (int i = 1; i <= n; i++)
{
int x;
cin >> x;
// 如果数字未出现过,则加入数组
if (mp[x] == 0)
{
a[++cur] = x;
}
// 标记数字已出现
mp[x] = 1;
}
// 对去重后的数字进行排序
sort(a + 1, a + cur + 1);
// 计算最长连续序列的长度
int cnt = 1; // 当前连续序列的长度
for (int i = 2; i <= cur; i++)
{
// 如果当前数字与前一个数字连续
if (a[i] == a[i - 1] + 1)
{
cnt++;
}
// 如果不连续,则更新最大值并重置计数器
else
{
maxn = max(maxn, cnt);
cnt = 1;
}
}
// 处理最后一个连续序列
maxn = max(maxn, cnt);
// 输出最长连续序列的长度
cout << maxn << endl;
return 0;
}
【运行结果】
4
1 0 2 4
3

浙公网安备 33010602011771号