#include <cstdio>
#include <vector>
#include <cstdint>
int main() {
int szerokosc;
scanf("%d", &szerokosc);
std::vector<int64_t> bursztyn;
std::vector<int64_t> poczatkow;
bursztyn.reserve(szerokosc);
int64_t poprzednio = 0;
int64_t wzrostow = 0;
int64_t suma = 0;
for (int i=0; i<szerokosc; ++i) {
int64_t tutaj;
scanf("%ld", &tutaj);
bursztyn.emplace_back(tutaj);
suma += tutaj;
if (poprzednio < tutaj) {
wzrostow += tutaj - poprzednio;
}
poprzednio = tutaj;
}
int64_t fala = szerokosc;
fala = std::min(fala, suma/wzrostow+1);
// printf("pocz %ld %ld\n", fala, suma);
for (; ; --fala) {
if (suma % fala != 0) {
// printf(" nie dzieli %ld %ld\n", fala, suma);
continue;
}
int64_t biegnacych = 0;
bool pasuje = true;
for(int i=0; i<szerokosc; ++i) {
if (fala <= i) {
biegnacych -= poczatkow[i-fala];
}
if (bursztyn[i] < biegnacych) {
// printf(" nie pasuje %ld [%d]\n", fala, i);
pasuje = false;
break;
}
// printf(" biegnacych[%d] bieg %ld bur %ld\n", i, biegnacych, bursztyn[i]);
poczatkow.emplace_back(bursztyn[i] - biegnacych);
// printf(" poczatkow [%d] %ld\n", i, poczatkow[i]);
biegnacych += poczatkow[i];
if (poczatkow[i] && szerokosc < i+fala) {
pasuje = false;
break;
}
}
poczatkow.clear();
if (pasuje) {
printf("%ld", fala);
break;
}
}
}
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 59 60 61 62 63 | #include <cstdio> #include <vector> #include <cstdint> int main() { int szerokosc; scanf("%d", &szerokosc); std::vector<int64_t> bursztyn; std::vector<int64_t> poczatkow; bursztyn.reserve(szerokosc); int64_t poprzednio = 0; int64_t wzrostow = 0; int64_t suma = 0; for (int i=0; i<szerokosc; ++i) { int64_t tutaj; scanf("%ld", &tutaj); bursztyn.emplace_back(tutaj); suma += tutaj; if (poprzednio < tutaj) { wzrostow += tutaj - poprzednio; } poprzednio = tutaj; } int64_t fala = szerokosc; fala = std::min(fala, suma/wzrostow+1); // printf("pocz %ld %ld\n", fala, suma); for (; ; --fala) { if (suma % fala != 0) { // printf(" nie dzieli %ld %ld\n", fala, suma); continue; } int64_t biegnacych = 0; bool pasuje = true; for(int i=0; i<szerokosc; ++i) { if (fala <= i) { biegnacych -= poczatkow[i-fala]; } if (bursztyn[i] < biegnacych) { // printf(" nie pasuje %ld [%d]\n", fala, i); pasuje = false; break; } // printf(" biegnacych[%d] bieg %ld bur %ld\n", i, biegnacych, bursztyn[i]); poczatkow.emplace_back(bursztyn[i] - biegnacych); // printf(" poczatkow [%d] %ld\n", i, poczatkow[i]); biegnacych += poczatkow[i]; if (poczatkow[i] && szerokosc < i+fala) { pasuje = false; break; } } poczatkow.clear(); if (pasuje) { printf("%ld", fala); break; } } } |
English