zoukankan      html  css  js  c++  java
  • codeforces 260 div2 C题

    C题就是个dp,把原数据排序去重之后得到新序列,设dp[i]表示在前i个数中取得最大分数,那么:

    if(a[i] != a[i-1]+1)   dp[i] = cnt[a[i]]*a[i] + dp[i-1];

    else      dp[i] = dp[i] = max(dp[i-1],a[i]*cnt[a[i]] + dp[i-2]),    dp[i-1]表示不取a[i], a[i]*cnt[a[i]] + dp[i-2]表示取a[i].

    cnt[a[i]]是a[i]出现的次数。

    #include<map>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<string>
    #include<vector>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    long long int a[100010], dp[100010], cnt[100010];
    int main(){
       int n,num(0);
       scanf("%d", &n);
       for(int i = 0;i < n;i ++) cin >> a[i];
       sort(a, a+n);
       for(int i = 0;i < n;i ++) cnt[a[i]] ++;
       for(int i = 1;i < n;i ++) if(a[i] != a[i-1]) a[++num] = a[i];
       if(num == 0){
           cout << a[0]*cnt[a[0]] << endl;
           return 0;
       }
       dp[0] = a[0]*cnt[a[0]];
       if(a[0] != a[1]-1) dp[1] = a[0]*cnt[a[0]] + a[1] * cnt[a[1]];
       else dp[1] = max(cnt[a[0]] * a[0], cnt[a[1]] * a[1]);
       for(int i = 2;i <= num;i ++){
           if(a[i] != a[i-1] + 1) dp[i] = dp[i-1] + cnt[a[i]]*a[i];
           else dp[i] = max(dp[i-1], a[i]*cnt[a[i]] + dp[i-2]);
       }
       cout << dp[num] << endl;
    }
    
    
    
    
  • 相关阅读:
    vue与自定义元素的关系
    vue用组件构建应用
    vue处理用户输入
    vue条件与循环
    vue声明式渲染
    Java编程的逻辑 (86)
    Java编程的逻辑 (85)
    Java编程的逻辑 (84)
    Java编程的逻辑 (83)
    Java编程的逻辑 (82)
  • 原文地址:https://www.cnblogs.com/anhuizhiye/p/3933118.html
Copyright © 2011-2022 走看看