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;
}