Alex doesn't like boredom. That's why whenever he gets bored, he comes up with games. One long winter evening he came up with a game and decided to play it.
Given a sequence a consisting of n integers. The player can make several steps. In a single step he can choose an element of the sequence (let's denote it ak) and delete it, at that all elements equal to ak + 1 and ak - 1 also must be deleted from the sequence. That step brings ak points to the player.
Alex is a perfectionist, so he decided to get as many points as possible. Help him.
The first line contains integer n (1 ≤ n ≤ 105) that shows how many numbers are in Alex's sequence.
The second line contains n integers a1, a2, ..., an (1 ≤ ai ≤ 105).
Print a single integer — the maximum number of points that Alex can earn.
2
1 2
2
3
1 2 3
4
9
1 2 1 3 2 2 2 2 3
10
Consider the third test example. At first step we need to choose any element equal to 2. After that step our sequence looks like this [2, 2, 2, 2]. Then we do 4 steps, on each step we choose any element equals to 2. In total we earn 10 points.
这道题的大概意思是输入n个数字,每次从中取出一个数k,并且将k-1和k+1抹去,然后继续取,直到取完为止,求最后取出数最大的和是多少。
想法是使用map函数,记录每个数的次数,然后从0到最大值遍历,使用动态规划的思想,每次记录两个数,一个是k-2的最大值,一个是k-1的最大值,然后用max(k-1,k-2+map[k]*k)求得当前最大值
#include<iostream> #include<map> #include<algorithm> using namespace std; map<long, int>mp; int main() { int n, num, p, q, maxn = 0; cin >> n; for (int i = 0;i < n;i++) { getchar(); cin >> num; mp[num]++; if (num > maxn) maxn = num; } if (n == 1) cout << num << endl; else { p = q = 0; for (long long i = 1;i <= maxn;i++) { long long temp = i*mp[i] + q; q = max(q, p); p = temp; } cout << max(p,q) << endl; } return 0; }
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; const int maxn = 1e5+5; int n, arr, c[maxn]; int main () { cin >> n; memset(c, 0, sizeof(c)); for (int i = 0; i < n; i++) { cin >> arr; c[arr]++; } ll p = 0, q = 0; for (int i = 1; i < maxn; i++) { ll tmp = q + 1LL * i * c[i]; q = max(p, q); p = tmp; } cout << max(p, q) << endl; return 0; }