#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;
}
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; } |
English