第三题 最长平台
题目描述
给定一个整数数列 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,…,an ,请找出最长平台,并输出最长平台的数量(数字相等但位置不同的平台算作不同的平台)。
所谓平台,就是指数列中一段连续的、完全相等的数字,单个数字可以成为一个平台。
输入格式
第一行:单个整数 n n n
第二行: n n n 个整数 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1,a2,…,an
输出格式
两个整数:表示最长平台的长度与最长平台的数量
数据范围
对于 50% 的数据, n ≤ 1000 n≤1000 n≤1000
对于 100% 的数据, n ≤ 500 , 000 n≤500,000 n≤500,000
1 ≤ a i ≤ 1 , 000 , 000 1≤a_i ≤1,000,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
说明:
每个数字单独成一个平台
分析:
思路一
本题没有任何技巧,一个数组就能 称霸江湖 过掉样例,本人的想法是:利用数组来模拟出最长的平台数量,再去找有几个,代码有点烦
代码:
100分
#include <bits/stdc++.h>
using namespace std;
#define MAXN 500000
long long a[MAXN];
int main(){
long long n,ans=0,vmax=0,s=0;
cin>>n;
for(int i=1;i<=n;++i){
cin>>a[i];
}
for(int i=1;i<=n;++i){
if(a[i]!=a[i-1]){
if(ans>vmax){
vmax=ans;
}
ans=1;
}else{
ans++;
}
}
for(int i=1;i<=n;++i){
if(a[i]!=a[i-1]){
if(ans==vmax){
s++;
}
ans=1;
}else{
ans++;
}
}
cout << vmax << " " << s << endl;
return 0;
}