B4416 [GESP202509 四级] 最长连续段

题目描述

对于 kkk 个整数构成的数组 [b1,b2,…,bk][b_1, b_2, \ldots, b_k][b1,b2,,bk],如果对 1≤i<k1 \leq i < k1i<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 81n8

对于所有测试点,保证 1≤n≤1051 \leq n \leq 10^51n105−109≤ai≤109-10^9 \leq a_i \leq 10^9109ai109

解析

模拟法,详见代码:

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

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐