zoukankan      html  css  js  c++  java
  • week10-拿数问题II

    C - 拿数问题 II
    YJQ 上完第10周的程序设计思维与实践后,想到一个绝妙的主意,他对拿数问题做了一点小修改,使得这道题变成了 拿数问题 II。 给一个序列,里边有 n 个数,每一步能拿走一个数,比如拿第 i 个数, Ai = x,得到相应的分数 x,但拿掉这个 Ai 后,x+1 和 x-1 (如果有 Aj = x+1 或 Aj = x-1 存在) 就会变得不可拿(但是有 Aj = x 的话可以继续拿这个 x)。求最大分数。

    本题和课上讲的有些许不一样,但是核心是一样,需要你自己思考。

    Input

    第一行包含一个整数 n (1 ≤ n ≤ 105),表示数字里的元素的个数。第二行包含n个整数a1, a2, …, an (1 ≤ ai ≤ 105)

    Output

    输出一个整数:n你能得到最大分值。

    思路:

    因为课上题目拿数之后数组中相邻数不可拿,但是在这里是按照大小的”相邻“,所以考虑直接对数进行排序,从而转换成数组中的相邻。

    还需要注意一个数可能存在很多个,这些都是可以继续拿的。

     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 const int maxn = 1e5+10;
     6 
     7 int a[maxn];
     8 int n;
     9 long long dp[maxn];
    10 long long time[maxn];
    11 int l=maxn,r=0;
    12 
    13 int main()
    14 {
    15     ios::sync_with_stdio(false);
    16     cin>>n;
    17     for(int i=1;i<=n;++i)
    18     {
    19         cin>>a[i];
    20         l = min(l,a[i]);
    21         r = max(r,a[i]);
    22         time[a[i]]++;
    23     }
    24     dp[l] = l * time[l];
    25     dp[0]=0;
    26     if(l==1)l++;
    27     for(long long i=l;i<=r;++i)
    28         dp[i]=max(dp[i-1],dp[i-2]+i*time[i]);
    29 
    30     cout<<dp[r];
    31     
    32     return 0;
    33 }
  • 相关阅读:
    Swift入门篇-Hello World
    Swift入门篇-swift简介
    Minecraft 插件 world edit 的cs 命令
    搭建本地MAVEN NEXUS 服务
    MC java 远程调试 plugin 开发
    企业内部从零开始安装docker hadoop 提纲
    javascript 命令方式 测试例子
    ca des key crt scr
    JSF 抽象和实现例子 (函数和属性)
    form 上传 html 代码
  • 原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/13053510.html
Copyright © 2011-2022 走看看