Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
2906 - Potrivire
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
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ă 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 == 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 == 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 == * 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 == ===Exemplul 1=== ; 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=== ; 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=== ; 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. <br> == Rezolvare == <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> ==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'''.
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width