4035 – Nr SecvS

De la Universitas MediaWiki

Sursa: Nr SecvS


Cerinţă

Se dă un șir cu n elemente întregi și s, un nr natural nenul. Subprogramul returnează numărul de secvențe din vector care au suma strict mai mare decât S.

Date de intrare

Programul va citi de la tastatură valoarean, apoi n numere întregi reprezentând elementele șirului, apoi valoarea s.

Date de ieșire

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele introduse sunt corecte!", apoi se va afișa numărul de secvențe din vector care au suma strict mai mare decât s. În cazul în care datele nu respectă restricțiile, se va afișa mesajul "Datele introduse nu sunt corecte!".

Restricţii şi precizări

  • 2 <= n <= 1.000.000
  • valorile elementelor șirului vor fi cuprinse între 1 și 1000
  • 1 <= s <= 10.000

Exemple

Exemplul 1

Intrare
Introduceti numarul de elemente a sirului: 4
Introduceti 4 numere separate prin spatiu:3 6 3 1
Introduceti valoarea s:10
Ieșire
Datele introduse sunt corecte!
Numarul de secvente accepate este: 2

Exemplul 2

Intrare
Introduceti numarul de elemente a sirului: 4
Introduceti 4 numere separate prin spatiu:123 12 3 5 4
Ieșire
Datele introduse sunt incorecte!

Exemplul 3

Intrare
IntroducIntroduceti numarul de elemente a sirului: 5
Introduceti 5 numere separate prin spatiu:123 1 3 1 4
Introduceti valoarea s:15
Ieșire
Datele ntroduse sunt corecte!
Numarul de secvente accepate este: 5

Rezolvare

def is_integer(value):
    return value.isdigit()


def verificare_nr_elemente(n):
    if is_integer(n):
        if 2 < int(n) < 1000000:
            return n
        else:
            print("Datele introduse sunt incorecte!")
            exit()
    else:
        print("Datele introduse sunt incorecte!")
        exit()


def verificare_vector(n, vector):
    if len(vector) != int(n):
        print("Datele introduse sunt incorecte!")
        exit()
    else:
        for i in vector:
            if is_integer(i):
                if 0 < int(i) < 1000:
                    continue
                else:
                    print("Datele introduse sunt incorecte!")
                    exit()
            else:
                print("Datele introduse sunt incorecte!")
                exit()


def verificare_s(s):
    if is_integer(s):
        if 0 < int(s) < 10000:
            return s
        else:
            print("Datele introduse sunt incorecte!")
            exit()
    else:
        print("Datele introduse sunt incorecte!")
        exit()


def nr_secv_s(sir, n, S):
    count = 0
    for i in range(int(n)):
        for j in range(i, int(n)):
            if sum(sir[i:j+1]) > int(S):
                count += 1
    print("Numarul de secvente accepate este:",count)


if __name__ == '__main__':
    n = input("Introduceti numarul de elemente a sirului: ")
    verificare_nr_elemente(n)
    elem = input(f"Introduceti {n} numere separate prin spatiu:").split()
    verificare_vector(n, elem)
    lst_int = list(map(int, elem))
    s = input("Introduceti valoarea s:")
    verificare_s(s)
    print("Datele ntroduse sunt corecte!")
    nr_secv_s(lst_int, n, s)

Explicație rezolvare

Programul implementează o funcție numită "nr_secv_s" care primește ca parametrii un tablou de numere nenule, numărul efectiv de elemente al tabloului și un număr natural nenul "S". Scopul funcției este de a calcula numărul de secvențe din tabloul dat care au suma strict mai mare decât "S" și de a afișa acest număr.

Funcția începe prin a inițializa un contor la zero și apoi parcurge toate perechile de poziții din tablou (folosind două bucle for îmbricate). Pentru fiecare astfel de pereche, funcția calculează suma elementelor din secvența corespunzătoare și dacă această sumă este strict mai mare decât "S", atunci contorul este incrementat.

La final, funcția afișează valoarea contorului, care reprezintă numărul de secvențe care îndeplinesc condiția cerută.

Înainte de apelarea funcției, sunt efectuate verificări asupra datelor introduse de utilizator: se verifică dacă numărul de elemente este un număr întreg între 2 și 1.000.000, dacă fiecare element din tablou este un număr întreg între 0 și 1000, și dacă numărul "S" este un număr întreg între 0 și 10.000. În cazul în care aceste verificări eșuează, programul va afișa un mesaj de eroare și va ieși din program.