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
64
65
66
67
68
69
70
71
#include <bits/stdc++.h>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int fragmenty;
	cin >> fragmenty;
	//tworzymy tablice opisującą nasz brzeg morza
	vector<int>bursztyny(fragmenty);
	long long wszystkie_bursztyny = 0;
	//ile fal to zmienna która będzie ilosc fal dla konkretnej długości fali
	int ile_fal = 0;
	//ta zmienna ma funckje żeby sprawdzać ile razy mosi być jeszcze fala na pierwszym elemencie
	int czy_mniej = 0;
	//jeżeli chcemy najdłuższą długosc fali to tym mniej fal tym fala dłuższa
	//daje największą możliwą liczbę jako start
	int min_wynik = fragmenty+1;
	//będzie ta tablica odpowiadać za porównywanie do bursztynów
	vector<int>operacyjne_fale(fragmenty, 0);
	//zmienna odpowiadająca za odpowiednie przerywanie pęti
	bool niepoprawne = false;
	// wczytujemy nasze wartości i tworzymy zmienna która przetrzymuje
	// ile_ogólnie wszytskich jest bursztynow
	for (int i = 0; i < fragmenty; i++){
		cin >> bursztyny[i];
		wszystkie_bursztyny += bursztyny[i];
	}
	//zaczynamy działania :), będziemy szli sprawdzając od największej
	//możliwej długości fali
	for (int i = fragmenty; i > 0; i--){
		//robimy warunek sprawdzający czy taką długością fali jesteśmy w stanie
		//uzupelnić wszyskie nasze bursztyny łącznie z wszystkiech segmentów
		if (wszystkie_bursztyny%i != 0)
			continue;
		//trzeba zerować dla każdej długości fal
		ile_fal = 0;
		//teraz robimy kolejną pętle, żeby sprawdzać starty(pocz) naszych fal
		for (int pocz = 0; i+pocz <= fragmenty; pocz++){
			ile_fal++;
			//ustawiamy operacyjne falem(pocz) na 1
			operacyjne_fale[pocz] = 1;
			//zmienna ta będzie odpowiadać za odpowiednie podstawianie do operac_fal
			int akt = 1;
			//dodajemy tyle fal żeby chciaż pierwszy element był rówy tyle ile powinien
			while (operacyjne_fale[pocz] < bursztyny[pocz]){
				operacyjne_fale[pocz]++; ile_fal++; akt++;
			}
			for (int j = pocz+1; j < pocz+i; j++){
				operacyjne_fale[j] = akt;
				if (operacyjne_fale[j] != bursztyny[j]){
					niepoprawne = true;
					break;
				}
			}
			if (niepoprawne == true){
				break;
			}
		}
		if (niepoprawne == true){
			ile_fal = 0;
			continue;
		}
		//wybieram mniejszą liczbę z poprzedniej długości fali, a terazniejszej
		min_wynik = min(ile_fal, min_wynik);
		
	}
	//bede wypisywać wszystkie_bursztyny podzielić na namniejsza liczbę fal
	cout << wszystkie_bursztyny/min_wynik;
	return 0;
}