/* 2026
* Maciej Szeptuch
*/
#include <cstdio>
#include <queue>
const int MAX_SIZE = 131072;
int size;
int count[MAX_SIZE];
long long int sum;
bool check(int wave)
{
if(sum % wave)
return false;
std::queue<std::pair<int, int>> que;
int level = 0;
for(int s = 0; s < size; ++s)
{
while(!que.empty() && que.front().second < s)
{
level -= que.front().first;
que.pop();
}
if(count[s] < level)
return false;
if(count[s] == level)
continue;
if(s + wave > size)
return false;
que.push({count[s] - level, s + wave - 1});
level = count[s];
}
return true;
}
int main(void)
{
scanf("%d", &size);
for(int s = 0; s < size; ++s)
{
scanf("%d", &count[s]);
sum += count[s];
}
int wave = size;
while(wave > 1 && !check(wave))
--wave;
printf("%d\n", wave);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | /* 2026 * Maciej Szeptuch */ #include <cstdio> #include <queue> const int MAX_SIZE = 131072; int size; int count[MAX_SIZE]; long long int sum; bool check(int wave) { if(sum % wave) return false; std::queue<std::pair<int, int>> que; int level = 0; for(int s = 0; s < size; ++s) { while(!que.empty() && que.front().second < s) { level -= que.front().first; que.pop(); } if(count[s] < level) return false; if(count[s] == level) continue; if(s + wave > size) return false; que.push({count[s] - level, s + wave - 1}); level = count[s]; } return true; } int main(void) { scanf("%d", &size); for(int s = 0; s < size; ++s) { scanf("%d", &count[s]); sum += count[s]; } int wave = size; while(wave > 1 && !check(wave)) --wave; printf("%d\n", wave); return 0; } |
English