解题思路:从每一个位置开始试着枚举,模拟流程,找到第一个没有被访问过的数的下标,如果这个数等于正在数的数,那么标记这个数已经被访问过,重新从1开始数,否则继续数,然后找到下一个没有被访问过的数,如果已经不合法那么直接退出。
#include <bits/stdc++.h>
#define x first
#define y second
#define mem(h) memset(h,-1,sizeof h)
#define mcp(a,b) memcpy(a,b,sizeof b)
using namespace std;
typedef long long LL;
typedef unsigned long long ull;
typedef pair< int , int > PII;
typedef pair< double , double > PDD;
namespace IO{
inline LL read ( ) {
LL o= 0 , f= 1 ; char c= getchar ( ) ;
while ( c< '0' || c> '9' ) { if ( c== '-' ) f= - 1 ; c= getchar ( ) ; }
while ( c>= '0' && c<= '9' ) { o= o* 10 + c- '0' ; c= getchar ( ) ; }
return o* f;
}
} using namespace IO;
const int N= 1e2 + 7 , M= 2e5 + 7 , INF= 0x3f3f3f3f , mod= 1e8 + 7 , P= 131 ;
int sum[ N] , a[ N] ;
bool st[ N] ;
int n;
void sovel ( int start) {
int now= start, k= 1 ;
while ( 1 ) {
while ( st[ now] ) {
now= ( now+ 1 ) % n;
}
if ( a[ now] == k) {
st[ now] = 1 ;
sum[ start] + = a[ now] ;
k= 1 ;
} else k++ ;
int i;
for ( i= 0 ; i< n; i++ ) {
if ( ! st[ i] ) break ;
}
if ( i>= n) break ;
if ( k> n) break ;
now= ( now+ 1 ) % n;
}
}
int main ( ) {
cin>> n;
for ( int i= 0 ; i< n; i++ ) cin>> a[ i] ;
for ( int i= 0 ; i< n; i++ ) {
memset ( st, 0 , sizeof st) ;
sovel ( i) ;
}
int ans= 0 ;
for ( int i= 0 ; i< n; i++ ) {
ans= max ( ans, sum[ i] ) ;
}
cout<< ans<< endl;
return 0 ;
}