题目A - Together AtCoder - arc082_a
题目
本题是一个数学问题。
有一个长度为n的自然数列a[1…n],对于每一个a[i],有三种操作:
①inc a[i];
②dec a[i];
③do nothing。
之后,选择一个自然数x,统计数列中等于x的元素的数目num(x),最大化答案。
考虑x有以下三种来源:
①x:=inc a[i],while a[i]==x-1;
②x:=dec a[i],while a[i]==x+1;
③x:=a[i],while a[i]==x。
于是,对于每一个x,num(x)的最大值为cnt(x-1)+cnt(x)+cnt(x+1)。
解题思路:
cnt[i]数组表示存入的第i个数的个数;于是,对于每一个x,num(x)的最大值为cnt(x-1)+cnt(x)+cnt(x+1);
#include<iostream>
#include<cstring>
using namespace std;
const int MAX=100005;
int cnt[MAX];//存储第i个数的个数
int main(){
int n;
cin >> n;
memset(cnt,0,sizeof(cnt));//清0
for(int i=0;i<n;i++){
int a;
cin >> a;
cnt[a]++;
}
int ans=0;
ans=cnt[0]+cnt[1];
for(int i=1;i<MAX;i++){
if(cnt[i]+cnt[i-1]+cnt[i+1]>ans) ans=cnt[i]+cnt[i-1]+cnt[i+1];
}
cout << ans;
return 0;
}