题意:
输入一个数n,接下来输入n个数,b[i]表示的是美丽值。她所经过的城市的路线必须满足b[j]-b[i]=j-i。问最大的美丽值是多少。
思路:
只要你稍微动一下你的笔,你就会发现,要想满足b[j]-b[i]=j-i,那移项之后就是b[j]-j=b[i]-i,所以说我们只要储存b[i]-i累加的值,直接线性寻找就可以了。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
int a[N];
int b[N];
int main()
{
int n;
cin >> n;
map<int , long long int> mp;
map<int , long long int>::iterator z;
for(int i = 1 ; i<= n ; i++)
{
cin >> a[i];
b[i] = a[i] - i;
}
for(int i = 1 ; i <= n ; i++)
{
mp[b[i]]=mp[b[i]]+(long long int)a[i];
}
long long int ans = 0;
for(z = mp.begin() ; z!=mp.end() ; z++)
{
ans = max(ans , z->second);
}
cout << ans << endl;
mp.clear();
return 0;
}