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
3707 - forta1
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== Definim forța unui element într-un șir ca fiind valoarea obținută considerând numărul de cifre pe care el le are în comun cu fiecare din celelalte elemente ale șirului și însumând aceste valori. De exemplu în șirul (12131, 1243, 15141) elementul 12131 are forța 6, deoarece 12131 are în comun cu 1243 trei cifre (1, 2 și 3) iar cu 15141 are în comun trei cifre (cele 3 cifre 1). Se dă un șir cu '''n''' elemente numere naturale. Să se sorteze elementele din șir în ordine crescătoare a forței, iar acele elemente care au aceeași forță să apară în ordine inversă decât apăreau inițial în șir. == Date de intrare == Fișierul de intrare '''forta.in''' conține pe prima linie n, numărul de elemente din șir, iar pe a doua linie n numere naturale separate prin câte un spațiu, reprezentând elementele șirului. == Date de ieșire == Dacă datele sunt introduse corect, pe ecran se va afișa: "Datele sunt introduse corect." Fișierul de ieșire '''forta.out''' va conține pe prima linie, separate prin câte un spațiu, elementele șirului în ordinea cerută. Î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 ≤ n ≤ 1000 *elementele șirului sunt numere naturale mai mici sau egale cu 1018 *pentru teste în valoare de 30 de puncte elementele șirului vor avea forțe distincte == Exemple == ===Exemplul 1=== ; ''forta.in'' :4 :123 121 12314 1234 ; ''ecran'' :Datele sunt introduse corect. ; ''forta.out'' :121 123 1234 12314 ===Exemplul 2=== ; ''forta.in'' :5 :2 3 5 7 11 ; ''ecran'' :Datele sunt introduse corect. ; ''forta.out'' :11 7 5 3 2 ===Exemplul 3=== ; ''forta.in'' :4 :-3 2 3 5 ; ''ecran'' :Datele nu corespund restricțiilor impuse. ; ''forta.out'' : <br> == Rezolvare == <syntaxhighlight lang="python" line="1"> # 3707 - forta1 def valideaza_date(numar_elemente, valori, distincte=False): if numar_elemente <= 0 or not all(isinstance(x, int) and x > 0 and x <= 10**18 for x in valori): return False if distincte and len(set(valori)) != numar_elemente: return False return True def rezolva_problema(numar_elemente, valori): class Forta: def __init__(self, valoare, frecventa, pozitie): self.valoare = valoare self.frecventa = frecventa self.pozitie = pozitie def numara_cifre_comune(numar1, numar2): frecventa1, frecventa2, numar_comun = [0] * 10, [0] * 10, 0 while numar1: frecventa1[numar1 % 10] += 1 numar1 //= 10 while numar2: frecventa2[numar2 % 10] += 1 numar2 //= 10 for i in range(10): if frecventa1[i] and frecventa2[i]: numar_comun += min(frecventa1[i], frecventa2[i]) return numar_comun valori_forta = [Forta(valoare=valori[i], frecventa=0, pozitie=i) for i in range(numar_elemente)] for i in range(numar_elemente - 1): for j in range(i + 1, numar_elemente): numar_cifre_comune = numara_cifre_comune(valori_forta[i].valoare, valori_forta[j].valoare) valori_forta[i].frecventa += numar_cifre_comune valori_forta[j].frecventa += numar_cifre_comune for i in range(numar_elemente - 1): for j in range(i + 1, numar_elemente): if valori_forta[i].frecventa > valori_forta[j].frecventa: valori_forta[i], valori_forta[j] = valori_forta[j], valori_forta[i] elif valori_forta[i].frecventa == valori_forta[j].frecventa: if valori_forta[i].pozitie < valori_forta[j].pozitie: valori_forta[i], valori_forta[j] = valori_forta[j], valori_forta[i] return [forta.valoare for forta in valori_forta] if __name__ == "__main__": with open("forta.in", "r") as fisier_intrare: numar_elemente = int(fisier_intrare.readline()) valori = list(map(int, fisier_intrare.readline().split())) if not valideaza_date(numar_elemente, valori, distincte=True): print("Datele nu corespund restricțiilor impuse.") exit(0) print("Datele sunt introduse corect.") rezultat = rezolva_problema(numar_elemente, valori) </syntaxhighlight> ==Explicatie== validare_date(n, v, distincte=False): Această funcție primește două argumente de intrare, numărul n și lista de numere întregi v, și returnează True dacă acestea sunt valide și False altfel. Verificările includ verificarea ca n să fie un număr întreg pozitiv și ca fiecare element din lista v să fie un număr întreg pozitiv mai mic sau egal cu 10^18. Argumentul opțional distincte specifică dacă toate elementele din lista v trebuie să fie distincte sau nu. rezolvare_problema(n, v): Această funcție primește două argumente de intrare, numărul n și lista de numere întregi v, și rezolvă problema descrisă în enunțul problemei. Funcția construiește o listă de obiecte Forta pentru fiecare element din lista v, fiecare obiect conținând valoarea elementului val, numărul de perechi de cifre comune cu alte numere din listă fr, și poziția sa în lista poz. Apoi, funcția calculează numărul de perechi de cifre comune pentru fiecare pereche posibilă de numere din listă și actualizează câmpul fr pentru fiecare obiect Forta. La final, lista de obiecte Forta este sortată în ordinea descrescătoare a valorii fr și a poziției poz, și valorile val ale obiectelor sunt extrase într-o listă separată, care este returnată de funcție. main(): Această funcție este punctul de intrare în program și se ocupă de citirea datelor din fișierul de intrare, apelarea funcției validare_date() pentru a verifica dacă datele sunt valide, apelarea funcției rezolvare_problema() pentru a rezolva problema descrisă în enunțul problemei și afișarea rezultatului în fișierul de ieșire. Dacă datele nu sunt valide, programul se va termina cu exit(0).
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