3658 – NrTriplete

De la Universitas MediaWiki

Sursa: NrTriplete


Cerinţă

Se dă un șir cu n elemente întregi și s, un nr întreg. Funcția returnează numărul de triplete (sir[i], sir[j], sir[k]), unde 0 ≤ i < j < k < n și sir[i] + sir[j] + sir[k] < 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 totalul de triplete care îndeplinesc condițiile date. În cazul în care datele nu respectă restricțiile, se va afișa mesajul "Datele introduse nu sunt corecte!".

Restricţii şi precizări

  • 3 <= n <= 2000
  • valorile elementelor șirului vor fi cuprinse între -100.000.000 și 100.000.000
  • -100.000.000 <= s <= 100.000.000

Exemple

Exemplul 1

Intrare
Introduceti numarul de elemente a sirului: 4
Introduceti 4 numere separate prin spatiu:1 -2 0 4
Introduceti valoarea s: 5
Ieșire
Datele introduse sunt corecte!
count: 3

Exemplul 2

Intrare
Introduceti numarul de elemente a sirului: 3
Introduceti 3 numere separate prin spatiu: 1231 1 321 41
Ieșire
Datele introduse sunt incorecte!

Rezolvare

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


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


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


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


def nr_triplete(sir, n, S):
    count = 0
    for i in range(n-2):
        for j in range(i+1, n-1):
            for k in range(j+1, n):
                if sir[i]+sir[j]+sir[k] < S:
                    count += 1
    print("count:",count)


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

Explicație rezolvare

  1. Funcția is_integer(value) verifică dacă value este un string reprezentând un număr întreg (adică conține doar cifre). Returnează True dacă este și False în caz contrar.
  2. Funcția verificare_nr_elemente(n) verifică dacă n este un string reprezentând un număr întreg între 3 și 2000. În cazul în care este valid, returnează n, altfel afișează un mesaj de eroare și iese din program.
  3. Funcția verificare_vector(n, vector) verifică dacă toate elementele din vector sunt numere întregi între -100000000 și 100000000. În cazul în care sunt valide, nu face nimic, altfel afișează un mesaj de eroare și iese din program.
  4. Funcția verificare_s(s) verifică dacă s este un string reprezentând un număr întreg între 3 și 2000. În cazul în care este valid, returnează s, altfel afișează un mesaj de eroare și iese din program.
  5. Funcția nr_triplete(sir, n, S) primește un tablou sir de n numere întregi și un număr întreg S. Parcurge toate tripletele posibile din tablou și numără cele pentru care suma este strict mai mică decât S. Afișează rezultatul final.
  6. În funcția main, se citesc numărul de elemente, vectorul și valoarea S cu ajutorul unor input-uri și se validează folosind funcțiile de mai sus. Apoi, se apelează funcția nr_triplete cu argumentele corespunzătoare.
  7. Comanda list(map(int, input(f"Introduceti {n} numere separate prin spatiu:").split())) transformă string-ul citit de la tastatură într-o listă de numere întregi. Mai întâi se citesc valorile cu input(f"Introduceti {n} numere separate prin spatiu:"), apoi se separă folosind funcția split() și se transformă fiecare element din listă într-un număr întreg folosind funcția int.