CCF-GESP计算机学会等级考试2025年9月四级C++T2 最长连续段
B4416 [GESP202509 四级] 最长连续段
题目描述
对于 kkk 个整数构成的数组 [b1,b2,…,bk][b_1, b_2, \ldots, b_k][b1,b2,…,bk],如果对 1≤i<k1 \leq i < k1≤i<k 都有 bi+1=bi+1b_{i+1} = b_i + 1bi+1=bi+1,那么称数组 bbb 是一个连续段。
给定由 nnn 个整数构成的数组 [a1,a2,…,an][a_1, a_2, \ldots, a_n][a1,a2,…,an],你可以任意重排数组 aaa 中元素顺序。请问在重排顺序之后,aaa 所有是连续段的子数组中,最长的子数组长度是多少?
例如,对于数组 [1,0,2,4][1, 0, 2, 4][1,0,2,4],可以将其重排为 [4,0,1,2][4, 0, 1, 2][4,0,1,2],有以下 101010 个子数组:
[4],[0],[1],[2],[4,0],[0,1],[1,2],[4,0,1],[0,1,2],[4,0,1,2][4], [0], [1], [2], [4, 0], [0, 1], [1, 2], [4, 0, 1], [0, 1, 2], [4, 0, 1, 2][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][4, 0], [4, 0, 1], [4, 0, 1, 2][4,0],[4,0,1],[4,0,1,2] 以外的子数组均是连续段,因此是连续段的子数组中,最长子数组长度为 3。
输入格式
第一行,一个正整数 nnn,表示数组长度。
第二行,nnn 个整数 a1,a2,…,ana_1, a_2, \ldots, a_na1,a2,…,an,表示数组中的整数。
输出格式
一行,一个整数,表示数组 aaa 重排顺序后,所有是连续段的子数组的最长长度。
输入输出样例 #1
输入 #1
4
1 0 2 4
输出 #1
3
输入输出样例 #2
输入 #2
9
9 9 8 2 4 4 3 5 3
输出 #2
4
说明/提示
对于 40%40\%40% 的测试点,保证 1≤n≤81 \leq n \leq 81≤n≤8。
对于所有测试点,保证 1≤n≤1051 \leq n \leq 10^51≤n≤105,−109≤ai≤109-10^9 \leq a_i \leq 10^9−109≤ai≤109。
解析
模拟法,详见代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[100005];
int ans=1;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+n+1);//排序
int m=1;
for(int i=2;i<=n;i++){
if (a[i]==a[i-1]){//跟上一个数相等,跳过(相当于去重)
continue;
}else if(a[i]==a[i-1]+1){//连上了,就增加一个
m++;
}else{//连不上,重新开头
m=1;
}
ans=max(ans,m);//取最大值
}
cout<<ans;
return 0;
}
更多推荐


所有评论(0)