zoukankan      html  css  js  c++  java
  • AcWing 3771. 选取石子

    这道题很简单,反思,学一下STL容器和哈希表
    哈希表在C++中对应的容器是unordered_map

    题目

    给定 n 个石子,编号为 1∼n。

    其中第 i 个石子的价值为 ai。

    你需要从中任意挑选若干个石子,并将挑选好的石子按照编号从小到大的顺序排成一排。

    选中的石子在排好序后需要满足,对于任意两个相邻的石子(不妨设它们的编号为 x,y),x−y=ax−ay 均成立。

    例如,当有 n=8 个石子,石子价值分别为 [3,4,4,6,6,7,8,9] 时,一些合理的选择方案如下:

    选择 1,2,4 号石子,它们的价值分别为 3,4,6。1 号石子与 2 号石子相邻,2−1=4−3 成立。2 号石子与 4 号石子相邻,4−2=6−4 成立。所以方案合理。
    选择 7 号石子。可以只选择一个石子,此时选取任何石子均为合理方案。
    你的选择方案不仅需要合理,而且还要使得选中石子的价值总和尽可能大。

    请计算并输出价值总和的最大可能值。

    输入输出

    第一行包含整数 n
    第二行包含 n 个整数 a1,a2,…,an。
    输出:一个整数,表示选中石子的价值总和的最大可能值。

    思路

    x−y=ax−ay,即 ax - x == ay - y
    将ax - x 看作每个元素的树形,用哈希表h[ax - x] += ax
    最后答案为哈希表中最大的元素

    #include <iostream>
    #include <cstring>
    #include <algorithm>
    #include <unordered_map>
    
    using namespace std;
    typedef long long LL;
    const int N = 200010;
    
    int main()
    {
        unordered_map<int,LL> h;
        unordered_map<int,LL>::iterator it;
        int n;
        cin >> n;
        for (int i = 0; i < n; i ++ ){
            int x;
            cin >> x;
            h[x - i] += x;
        }
        LL res = 0;
        for(it = h.begin();it != h.end();it ++){
            res = max(res,it->second);
        }
        cout << res;
        return 0;
    }
    
    作者:inss!w!
    版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 相关阅读:
    数据结构与算法
    c++学习笔记
    红黑树(map与unorder_map)B B+树
    数据库笔记
    多路复用IO:select poll epoll
    https加密过程!!! 这才是差不多非常详细的https双方获取共用的秘钥过程!!!!!
    助教周报(第一轮)——范青青
    第二十二周助教总结(2021.6.28-7.4)
    第二十一周助教总结(2021.6.21-6.27)
    第二十周助教总结(2021.6.14-6.20)
  • 原文地址:https://www.cnblogs.com/Hfolsvh/p/15024926.html
Copyright © 2011-2022 走看看