2906 - Potrivire: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: Sursa: [https://www.pbinfo.ro/probleme/2906/potrivire - Potrivire] ---- == Cerinţa == Gigel a găsit un șir de '''n''' cifre minunate. A adormit cu ele în brațe și a visat '''m''' numere naturale. Nedumerit, a cerut părerea vrăjitoarei Ghiocica. Acesta i-a spus: * - Gigele, ești norocos. Suma numerelor distincte visate care sunt scrise cu cifre consecutive în șirul de cifre minunate este suma pe care o vei câștiga la Loto. Nerăbdător, Gigel vă roagă să scri...
 
 
(One intermediate revision by the same user not shown)
Line 30: Line 30:
===Exemplul 2===
===Exemplul 2===
; potrivire.in
; potrivire.in
:  
: 6
:
: 1 0 3 1 4 5
:
: 8
:
: 111 1231 4124 5741 4124 22 21 12
; Ieșire
; Ieșire
: Datele sunt corecte.
: Datele sunt corecte.
; potrivire.out
; potrivire.out
:  
: 0
===Exemplul 3===
===Exemplul 3===
; potrivire.in
; potrivire.in
:  
: 10
:
: 4 5 6 2 6 0 7 1 9 7
:
: 2
:
: 12414124215 1251251512
; Ieșire
; Ieșire
: Datele nu sunt comform restricțiilor impuse.
: Datele nu sunt comform restricțiilor impuse.
Line 49: Line 49:
== Rezolvare ==  
== Rezolvare ==  
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#2906 - Potrivire




def potrivire(n, cifre, m, numere_visate):
    f = open("potrivire.out", "w")
    frecventa = {}
    s = 0
    for i in range(n):
        num = 0
        for j in range(i, min(i + 4, n)):
            num = num * 10 + cifre[j]
            if num not in frecventa:
                frecventa[num] = 0
            frecventa[num] += 1
    for i in range(m):
        if numere_visate[i] in frecventa and frecventa[numere_visate[i]] != 0 and frecventa[numere_visate[i]] != -1:
            s += numere_visate[i]
            frecventa[numere_visate[i]] = -1
    f.write(str(s))
    f.close()
def conform_restrictiilor():
    with open("potrivire.in", "r") as f:
        n = int(f.readline())
        cifre = list(map(int, f.readline().split()))
        m = int(f.readline())
        numere_visate = list(map(int, f.readline().split()))
        if not (1 <= m <= 100000) and not (1 <= n <= 100000):
            print("Datele nu sunt conform restricțiilor impuse.")
            exit()
        for x in numere_visate:
            if x > 100000:
                print("Datele nu sunt conform restricțiilor impuse.")
                exit()
        for x in cifre:
            if x >= 10:
                print("Datele nu sunt conform restricțiilor impuse.")
                exit()
        print("Datele sunt corecte.")
        return n, cifre, m, numere_visate
if __name__ == '__main__':
    n, cifre, m, numere_visate = conform_restrictiilor()
    potrivire(n, cifre, m, numere_visate)
</syntaxhighlight>
</syntaxhighlight>


==Explicaţie cod==
==Explicaţie cod==
Funcția '''conform_restrictiilor()''' verifică dacă datele de intrare sunt conforme cu restricțiile impuse în problemă, respectiv: '''n''' și '''m''' trebuie să fie între 1 și 100.000, inclusiv, cifre și numere_visate trebuie să conțină numere între 0 și 100.000, inclusiv, iar cifrele din cifre trebuie să fie mai mici decât 10.
Funcția '''potrivire()''' primește ca argumente '''n''', '''cifre''', '''m''' și '''numere_visate''', determină toate numerele care pot fi formate prin combinarea unui subset de cifre consecutive din cifre, și calculează suma tuturor numerelor din numere_visate care se regăsesc printre numerele calculate. Aceasta se realizează prin parcurgerea tuturor subset-urilor de cifre consecutive și adăugarea numerelor rezultate într-un dicționar care memorează frecvența aparițiilor acestora. Apoi, pentru fiecare număr din numere_visate, se verifică dacă acesta se regăsește în dicționar și dacă apare cel puțin o dată și nu a fost deja adăugat la sumă.
La final, suma calculată este scrisă în fișierul '''potrivire.out'''.

Latest revision as of 14:48, 30 April 2023

Sursa: - Potrivire


Cerinţa[edit]

Gigel a găsit un șir de n cifre minunate. A adormit cu ele în brațe și a visat m numere naturale. Nedumerit, a cerut părerea vrăjitoarei Ghiocica. Acesta i-a spus:

  • - Gigele, ești norocos. Suma numerelor distincte visate care sunt scrise cu cifre consecutive în șirul de cifre minunate este suma pe care o vei câștiga la Loto.

Nerăbdător, Gigel vă roagă să scrieți un program care să citească cele n cifre și cele m numere și să determine suma pe care o va câștiga la Loto.

Date de intrare[edit]

Fișierul de intrare potrivire.in conține pe prima linie numărul n; a doua linie conține șirul de n cifre. A treia linie conține numărul m, iar a patra linie conține cele m numere.

Date de ieșire[edit]

Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt corecte.", iar apoi in fișierul de ieșire potrivire.out va conține pe prima linie numărul S, reprezentând suma pe care o va câștiga Gigel. În caz contrar, se va afișa pe ecran: "Datele nu sunt comform restricțiilor impuse.".

Restricţii şi precizări[edit]

  • 1 ≤ n, m ≤ 100.000
  • pentru 50% din teste, 1 ≤ n, m ≤ 1000
  • cele m numere visate sunt numere naturale și au cel mult cinci cifre

Exemple[edit]

Exemplul 1[edit]

potrivire.in
10
4 5 6 2 6 0 7 1 9 7
6
456 662 2607 2607 97 975
Ieșire
Datele sunt corecte.
potrivire.out
3160

Exemplul 2[edit]

potrivire.in
6
1 0 3 1 4 5
8
111 1231 4124 5741 4124 22 21 12
Ieșire
Datele sunt corecte.
potrivire.out
0

Exemplul 3[edit]

potrivire.in
10
4 5 6 2 6 0 7 1 9 7
2
12414124215 1251251512
Ieșire
Datele nu sunt comform restricțiilor impuse.


Rezolvare[edit]

<syntaxhighlight lang="python" line>

  1. 2906 - Potrivire


def potrivire(n, cifre, m, numere_visate):

   f = open("potrivire.out", "w")
   frecventa = {}
   s = 0
   for i in range(n):
       num = 0
       for j in range(i, min(i + 4, n)):
           num = num * 10 + cifre[j]
           if num not in frecventa:
               frecventa[num] = 0
           frecventa[num] += 1
   for i in range(m):
       if numere_visate[i] in frecventa and frecventa[numere_visate[i]] != 0 and frecventa[numere_visate[i]] != -1:
           s += numere_visate[i]
           frecventa[numere_visate[i]] = -1
   f.write(str(s))
   f.close()

def conform_restrictiilor():

   with open("potrivire.in", "r") as f:
       n = int(f.readline())
       cifre = list(map(int, f.readline().split()))
       m = int(f.readline())
       numere_visate = list(map(int, f.readline().split()))
       if not (1 <= m <= 100000) and not (1 <= n <= 100000):
           print("Datele nu sunt conform restricțiilor impuse.")
           exit()
       for x in numere_visate:
           if x > 100000:
               print("Datele nu sunt conform restricțiilor impuse.")
               exit()
       for x in cifre:
           if x >= 10:
               print("Datele nu sunt conform restricțiilor impuse.")
               exit()
       print("Datele sunt corecte.")
       return n, cifre, m, numere_visate

if __name__ == '__main__':

   n, cifre, m, numere_visate = conform_restrictiilor()
   potrivire(n, cifre, m, numere_visate)

</syntaxhighlight>

Explicaţie cod[edit]

Funcția conform_restrictiilor() verifică dacă datele de intrare sunt conforme cu restricțiile impuse în problemă, respectiv: n și m trebuie să fie între 1 și 100.000, inclusiv, cifre și numere_visate trebuie să conțină numere între 0 și 100.000, inclusiv, iar cifrele din cifre trebuie să fie mai mici decât 10.

Funcția potrivire() primește ca argumente n, cifre, m și numere_visate, determină toate numerele care pot fi formate prin combinarea unui subset de cifre consecutive din cifre, și calculează suma tuturor numerelor din numere_visate care se regăsesc printre numerele calculate. Aceasta se realizează prin parcurgerea tuturor subset-urilor de cifre consecutive și adăugarea numerelor rezultate într-un dicționar care memorează frecvența aparițiilor acestora. Apoi, pentru fiecare număr din numere_visate, se verifică dacă acesta se regăsește în dicționar și dacă apare cel puțin o dată și nu a fost deja adăugat la sumă.

La final, suma calculată este scrisă în fișierul potrivire.out.