3771. 选取石子

3771. 选取石子

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

其中第 ii 个石子的价值为 aiai。

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

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

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

  • 选择 1,2,41,2,4 号石子,它们的价值分别为 3,4,63,4,6。11 号石子与 22 号石子相邻,2−1=4−32−1=4−3 成立。22 号石子与 44 号石子相邻,4−2=6−44−2=6−4 成立。所以方案合理。
  • 选择 77 号石子。可以只选择一个石子,此时选取任何石子均为合理方案。

你的选择方案不仅需要合理,而且还要使得选中石子的价值总和尽可能大。

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

输入格式

第一行包含整数 nn。

第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an。

输出格式

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

数据范围

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

输入样例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

只有当ai-aj=i-j才成立

所以ai-i=aj-j

用map标记ai-i

统计ai的和

然后求出最大值

即可 

#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
int main()
{
   
    long long a[200005];
    long long maxn;
    int n,k;
    cin>>n;
    map<long long,long long>m;
    for (int i = 0; i < n; i ++ )
    {
        cin>>a[i];
        m[a[i]-i]+=a[i];
    }
     for (auto &[k,v]: m) 
    maxn =max(maxn,v);
    cout<<maxn<<endl;
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值