题目描述
盒子里面有N个球,每个球上都有一个数,你每次可以取走一个球,这个球上的数是x,你就可以得到x的分值,若还有其他的球上的数值也是x,你可以将这些球一起取走,但同时就有一个限制:其他的球,若上面的数为x-1或x+1的话就不能被取了,相当于这些球被剔除。求你能取得的最大分值。
输入格式
第一行,一个整数N。
第二行,N个整数,为球上的数值xi
输出格式
输出一行,为一个整数,意义如题所述。
样例
输入#1
5
5 3 5 3 4
输出#1
16
数据范围/约定
1<=N<=1000000
1<=xi<=1000000
//***Mark1277***//
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,t,cnt[N],maxt;long long f[N];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t;
cnt[t]++;maxt=max(maxt,t);
}f[1]=cnt[1];f[2]=max(cnt[1],cnt[2]*2);
for(int i=1;i<=maxt;i++)
{
f[i]=max(f[i-1],f[i-2]+cnt[i]*i);
}
cout<<f[maxt];
}