Description
给你一个数列,共N个数字 你可以对每个数字,做如下三种操作之一
1:将这个数字加1
2:将这个数字减去1
3:什么事也不做
最终希望在这个数列中,某个数字出现的次数越多越好,输出出现次数即可。
Format
Input
第一行给出N
第二行给出N个数字
N<=1e5,数字的权值在[0,1e5]之间.
Output
如题
Samples
输入数据 1
7
3 1 4 1 5 9 2
Copy
输出数据 1
4
Copy
Hint
将这个数列变成2 2 4 2 5 9 2
Limitation
1s, 102400KiB for each test case.
我的代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int N;
cin>>N;
int a[100000];
int b[100000] = {0};
for(int i = 0;i < N;i++){
cin>>a[i];}
for(int i = 0;i < N;i++){
int m;
m = a[i];
b[m] = b[m] + 1;
}
for(int i = 0;i < N;i++){
int m;
m = a[i] + 1;
b[m] = b[m] + 1;
}
for(int i = 0;i < N;i++){
int m;
m = a[i] - 1;
b[m] = b[m] + 1;
}
int max;
for(int i = 0;i < 10;i++){
if(b[i]>b[max]){
max = i;
}
}
printf("%d",b[max]);
return 0;
}
AC了一小部分,估计是只能通过全正数的,负数没想出来呢
本题正确答案:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[100005];
int main(){
int n;
cin>>n;
map<int,int>m;
for(int i=0;i<n;i++){
cin>>a[i];
m[a[i]]++;
}
sort(a,a+n);
int ans=0;
for(int i=0;i<=100000;i++){
ans=max(ans,m[i]+m[i-1]+m[i+1]);
}
cout<<ans;
return 0;
}
C++学得不好不明白呜呜