题目描述
盒子里面有N个球,每个球上都有一个数,你每次可以取走一个球,这个球上的数是X,你就可以得到X的分值,若还有其他的球上的数值也是X,你也可以将这些球一并取走,但是同时就有一个限制:其他的球,若上面的数为X-1或X+1的话,就不能被取了,相当于这些球被删除。求你能取得的最大分值。
输入格式
第1行:一个整数N,表示球的数量。
第2行:N个整数,表示球上的数值Xi。
输出格式
一行:一个整数,表示可以取得的最大分值。
输入输出样例
输入样例1:
5 5 3 5 3 4
输出样例1:
16
说明
【样例说明】
取3和5,4不可取,可以获得2 * 3 + 2 * 5 = 16分。
【数据范围】
对于100%的数据:1 ≤ N ≤ 1000000,1 ≤ Xi ≤ 1000000,
【耗时限制】1000ms 【内存限制】128MB
//
//Created by Carlgood.
//
#include<iostream>
#include<cmath>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<sstream>
#define This_program_is_written_by_Carlgood 9876543210
long long a[1000010],dp[1000010];
using namespace std;
int main()
{
int n,x,maxn;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
a[x]++;
maxn=max(maxn,x);
}
for(int i=1;i<=maxn;i++)
{
dp[i]=max(dp[i-1],dp[i-2]+i*a[i]);
}
cout<<dp[maxn];
return 0;
}