传送门
看了题目数据大小,又是贪心,时间复杂度O(N),这几天一直做B/C题把自己给做出PTSD来了都。
我の思路
- 假设选定任意一个下标从当前位置开始计算,那么它后面的相应的数字都会被计算上。
- 也就是说,当后面再在后面选择的时候,就有可能会选到从前面跳过去的数字,这样的话就会造成重复计算,也就是说,
从前面选比从后面选择更优,或者说,最好是从前面选,然后每一次碰到的都标记上,这样在后续遍历的时候假设碰到之前跳到这里了就不需要再重复计算了。
My solution
📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣
#include <iostream>
#include <cstring>
#include <algorithm>
#define IOS ios::sync_with_stdio(false)
using namespace std;
const int N = 2e5 + 10;
bool vis[N];
int a[N];
void solve(){
memset(vis, 0, sizeof vis);
int n;
cin >> n;
for(int i = 1; i <= n; i ++) cin >> a[i];
int maxn = 0;
for(int i = 1; i <= n; i ++){
int sum = 0, j = i;
if(!vis[i]){
sum += a[j];
vis[j] = true;
while(j + a[j] <= n && !vis[j + a[j]]){
sum += a[j + a[j]];
j = j + a[j];
vis[j] = true;
}
maxn = max(maxn, sum);
}
}
cout << maxn << endl;
}
int main(){
IOS;
int t;
cin >> t;
while(t --){
solve();
}
return 0;
}
📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣📣