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
1759 - Alune
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!
==Cerința== Chip şi Dale s-au plictisit de jocurile de până acum şi au hotărât că este timpul să îmbine culesul alunelor cu un joc care să le stimuleze inteligenţa. Chip propune: “eu pun alunele culese de mine într-un şir de '''C''' scorburi, iar tu pui alunele culese de tine într-un alt şir, de '''D''' scorburi”. Dale a ascultat, a fost de acord și a propus ca jocul să continue astfel: „dacă la împărțirea numărului de alune din prima scorbură a șirului meu la numărul de alune din fiecare scorbură a șirului tău se obține același rest, atunci consider că scorbura mea este umplută corect și scriu pe hârtie cifra 1, altfel o consider umplută incorect și scriu cifra 0. Verific apoi, aplicând aceeași regulă, dacă a doua scorbură din șirul meu este umplută corect, adică dacă la împărțirea numărului de alune din aceasta la numărul de alune din fiecare scorbură din șirul tău, se obține același rest. Notez pe hârtie, în continuare, rezultatul verificării (0 sau 1). Încheiem jocul atunci când terminăm de verificat, după această regulă, toate cele '''D''' scorburi ale mele.” Scrieți un program care citește din fișierul '''alune.in''' numerele naturale nenule '''C''' și '''D''' și numărul de alune din fiecare scorbură din șirul lui Chip, respectiv al lui Dale. Programul determină șirul de cifre notat de Dale pe hârtie. == Date de intrare == Fișierul '''alune.in''' conține pe prima linie cele două numere naturale, '''C''' și '''D''', pe a doua linie '''C''' numere naturale, reprezentând numărul de alune din fiecare scorbură a lui Chip, iar pe a treia linie '''D''' numere naturale, reprezentând numărul de alune din fiecare scorbură a lui Dale. Toate numerele situate pe aceeași linie a fișierului sunt separate prin câte un spațiu. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect." Fișierul '''alune.out''' conține o singură linie pe care se află șirul determinat. Cifrele din acest șir nu sunt separate prin spații. În cazul în care datele nu respectă restricțiile, se va afișa: "Datele nu corespund restricțiilor impuse.". == Restricţii şi precizări == *1 ≤ '''C''', '''D''' ≤ 100 *Numerele de alune din scorburile lui Chip, scrise pe a doua linie a fişierului de intrare, sunt numere naturale din intervalul [1, 2 000 000 000]; *Numerele de alune din scorburile lui Dale, scrise pe a treia linie a fişierului de intrare, sunt numere naturale din intervalul [0, 2 000 000 000]. == Exemple == ===Exemplul 1=== ; ''alune.in'' :3 2 :3 4 5 :8 2 ; ''ecran'' :Datele sunt introduse corect. ; ''alune.out'' :01 ===Exemplul 2=== ; ''alune.in'' :4 4 :1 2 3 4 :1 3 4 2 ; ''ecran'' :Datele sunt introduse corect. ; ''alune.out'' :14 ===Exemplul 3=== ; ''alune.in'' :0 1 :4 :5 ; ''ecran'' :Datele nu corespund restricțiilor impuse. ; ''alune.out'' : <br> == Rezolvare == <syntaxhighlight lang="python" line="1"> # 1759 - Alune def validare_date(C: int, D: int, C_values: list[int], D_values: list[int]) -> bool: if not(1 <= C <= 100000 and 1 <= D <= 100000): return False if any(not (1 <= x <= 2000000000) for x in C_values) or any(not (0 <= x <= 2000000000) for x in D_values): return False return True def rezolvare(C: int, D: int, C_values: list[int], D_values: list[int]) -> str: suma_C = sum(C_values) suma_D = sum(D_values) if suma_C != suma_D: return "0 1" alune_transferate = 0 nr_transferuri = 0 for i in range(C): dif_alune = D_values[i] - C_values[i] if dif_alune > 0: alune_transferate += dif_alune nr_transferuri += dif_alune elif dif_alune < 0: nr_transferuri += abs(dif_alune) if alune_transferate < abs(dif_alune): return "0 1" else: alune_transferate -= abs(dif_alune) return "1{}".format(nr_transferuri) if __name__ == '__main__': try: with open("alune.in") as f: C, D = map(int, f.readline().split()) C_values = list(map(int, f.readline().split())) D_values = list(map(int, f.readline().split())) if not validare_date(C, D, C_values, D_values): print("Datele nu corespund restricțiilor impuse.") else: print("Datele sunt introduse corect.") raspuns = rezolvare(C, D, C_values, D_values).strip() with open("alune.out", "w") as g: g.write(raspuns.replace(" ", "") + "\n") except FileNotFoundError: print() </syntaxhighlight> ==Explicatie== validare_date(C: int, D: int, C_values: list[int], D_values: list[int]) -> bool Această funcție primește patru parametri: C: un număr întreg reprezentând numărul de scoruri ale lui Chip D: un număr întreg reprezentând numărul de scoruri ale lui Dale C_values: o listă de întregi reprezentând numărul de alune din fiecare scor a lui Chip D_values: o listă de întregi reprezentând numărul de alune din fiecare scor a lui Dale Funcția verifică dacă valorile primite respectă restricțiile impuse de problema: 1 ≤ C, D ≤ 100000, 1 ≤ alune_C ≤ 2 000 000 000, 0 ≤ alune_D ≤ 2 000 000 000. Dacă toate valorile sunt în intervalul permis, funcția returnează True, altfel returnează False. rezolvare(C: int, D: int, C_values: list[int], D_values: list[int]) -> str Această funcție primește aceiași patru parametri ca și validare_date(). Funcția calculează numărul de alune care trebuie transferate între scorburile lui Chip și Dale pentru a avea același număr de alune în fiecare scorbură. Dacă suma alunelor din scorburile lui Chip nu este egală cu suma alunelor din scorburile lui Dale, funcția returnează "0 1", altfel calculează diferența dintre numărul de alune din scorburile lui Dale și cele din scorburile lui Chip. Dacă diferența este pozitivă, înseamnă că trebuie transferate alune de la scorburile lui Dale către cele ale lui Chip pentru a obține numărul egal de alune. Dacă diferența este negativă, atunci trebuie transferate alune de la scorburile lui Chip către cele ale lui Dale. În ambele cazuri, funcția returnează o valoare de tip șir de caractere formată din "1" urmată de numărul de alune care trebuie transferate. if __name__ == '__main__': Această secțiune de cod verifică dacă acesta este fișierul principal care este executat, prin verificarea dacă variabila specială __name__ are valoarea __main__. Dacă această condiție este îndeplinită, codul din interiorul acestei secțiuni va fi executat. În interiorul acestei secțiuni, programul deschide fișierul "alune.in" și citește valorile din acesta utilizând funcțiile validare_date() și rezolvare(). Dacă datele de intrare sunt valide, programul scrie rezultatul în fișierul "alune.out". În caz contrar, se afișează un mesaj specific
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