455A Boredom

来源:互联网 发布:知其所以然的意思 编辑:程序博客网 时间:2024/04/30 01:14


简单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;}


0 0
原创粉丝点击