题目描述
给定一个整数数列 a1,a2,…,an,请找出最长平台。所谓平台,就是指数列中一段连续的、完全相等的数字,单
个数字也可以成为一个平台。最长平台可能不止一个,在找到最长平台的同时,输出最长平台的数量。
输入格式
第一行:单个整数 n
第二行:n 个整数 a1,a2,…,an
输出格式
两个整数:表示最长平台的长度与最长平台的数量
数据范围
。对于 50% 的数据,n< 1000
。对于 100% 的数据,n< 500,000
。 1<ai< 1,000,000
输入:
7
2 2 2 1 3 3 3
输出:
3 2
说明:
最长平台为2 2 2或3 3 3
输入:
5
3 1 4 1 5
输出:
1 5
说明:
每个数字单独成一个平台
分析
知识点:模拟
解题思路:
维护 l a s , d q , c n t , m x las,dq,cnt,mx las,dq,cnt,mx 分别表示上一个数是多少,目前平台的长度,最长平台的个数和长度。
对于一个数,如果和 las 不同,则考虑 las 所在段是否能成为答案,如果比 mx 大则更新 mx 并把 cnt 置 0,然后如果有长度和 mx 相等则 cnt++
然后把当前平台的长度+1
复杂度 O ( n ) O(n) O(n)
代码
#include<bits/stdc++.h>
using namespace std;
int const N=1e6+10;
int n,a[N];
int main(){
cin>>n;
int las=0,dq=0,cnt=0,mx=-1;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]!=las){
if(dq>mx){
mx=dq; cnt=0;
}
if(dq==mx) cnt++;
dq=0;
}
las=a[i]; dq++;
//cout<<cnt<<endl;
}
if(dq>mx) cnt=0,mx=dq;
if(dq==mx) cnt++;
cout<<mx<<' '<<cnt<<endl;
}