CodeForces1320A
题目描述
难度 :1400
标签 :data structres、DP、greedy、math、sortings
思路
将题目中所给条件
c
i
+
1
−
c
i
=
b
c
i
+
1
−
b
c
i
c_{i+1}-c_i=b_{c_{i+1}}-b_{c_i}
ci+1−ci=bci+1−bci转化为
b
c
i
−
c
i
=
b
c
i
+
1
−
c
i
+
1
b_{c_i}-c_i=b_{c_{i+1}}-c_{i+1}
bci−ci=bci+1−ci+1
令
s
i
=
b
c
i
−
c
i
s_i=b_{c_i}-c_i
si=bci−ci
即将问题转换为求
s
i
s_i
si相同的位置上的
b
i
b_i
bi的最大值。
我们用一个循环去遍历数组,用
m
a
p
map
map维护每一种
s
i
s_i
si上的
b
i
b_i
bi的和,并用
r
e
s
res
res记录其最大值
最后得到的
r
e
s
res
res即为结果
时间复杂度
O(n)
C++ 代码
#include<iostream>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
const int maxn=2e5+5;
int b[maxn],s[maxn];
map<int,ll> mp;
int main(){
ll res=0;
int n;cin>>n;
for(int i=1;i<=n;i++){
cin>>b[i];
s[i]=b[i]-i;
if(!mp[s[i]]) mp[s[i]]=0;
mp[s[i]]+=b[i];
res=max(res,mp[s[i]]);
}
cout<<res<<endl;
return 0;
}