3771 选取石子(哈希表)

1. 问题描述:

给定 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。

输出格式

一个整数,表示选中石子的价值总和的最大可能值。

数据范围

前三个测试点满足 1 ≤ n ≤ 10。
全部测试点满足 1 ≤ n ≤ 2 × 10 ^ 5,1 ≤ ai ≤ 4 × 10 ^ 5。

输入样例1:

6
10 7 1 9 10 15

输出样例1:

26

输入样例2:

1
400000

输出样例2:

400000

输入样例3:

7
8 9 26 11 12 29 14

输出样例3:

55
来源:https://www.acwing.com/problem/content/3774/

2. 思路分析:

分析题目可以知道编号减去价值相等的石子属于同一类,所以我们可以使用哈希表将这些相同类的石子映射到哈希表中,哈希表的值为同一类的石子价值,最后遍历一下哈希表找到价值最大的一类石子即可。

3. 代码如下:

class Solution:
    def process(self):
        n = int(input())
        w = list(map(int, input().split()))
        mp = dict()
        for i in range(1, n + 1):
            if i - w[i - 1] not in mp:
                mp[i - w[i - 1]] = w[i - 1]
            else: mp[i - w[i - 1]] += w[i - 1]
        res = 0
        for k, v in mp.items():
            res = max(res, v)
        return res


if __name__ == '__main__':
    print(Solution().process())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值