简单DP。
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <algorithm>
#include <functional>
using namespace std;
const int maxn = 100010;
typedef long long ll;
ll arr[maxn], dp[maxn];
ll v[maxn], c[maxn];
ll min(ll a, ll b) {
return a < b ? a : b;
}
ll max(ll a, ll b) {
return a > b ? a : b;
}
int main() {
int n, m = 0;
scanf("%d", &n);
for(int i = 1; i <= n; ++i) {
cin >> arr[i];
}
sort(arr + 1, arr + n + 1);
arr[0] = 0;
for(int i = 1; i <= n; ++i) {
if(arr[i] != arr[i-1]) {
v[++m] = arr[i];
c[m] = 1;
} else {
c[m]++;
}
}
dp[0] = 0; c[0] = 0;
dp[1] = v[1] * c[1];
for(int i = 2; i <= m; ++i) {
if(v[i] == v[i-1] + 1) {
if(v[i-2] + 1 == v[i-1]) {
ll t = v[i-1] * c[i-1];
if(i >= 3) {
t += dp[i-3];
}
dp[i] = max(dp[i-2] + v[i] * c[i], t);
} else {
dp[i] = max(dp[i-2] + v[i-1]*c[i-1], dp[i-2] + v[i]*c[i]);
}
} else {
dp[i] = dp[i-1] + v[i] * c[i];
}
}
cout << dp[m] << endl;
return 0;
}