0979 - Alice: Difference between revisions

From Bitnami MediaWiki
Andrada378 (talk | contribs)
Pagină nouă: Într-o zi frumoasă de vară, Alice se juca în parc. Deodată, văzu un iepure cu ceas, numit Iepurele Alb, sărind grăbit în scorbura unui copac. Curioasă, Alice îl urmări şi sări şi ea în scorbură. Spre mirarea ei, ajunse într-o sală mare cu N uşi încuiate. Pe fiecare uşă era scris câte un număr natural. Într-o clipă, lângă ea apăru Iepurele Alb şi-i spuse că doar uşile cu numere magice pot fi deschise dacă are cheile potrivite. Pentru a o ajuta...
 
Andrada378 (talk | contribs)
 
(One intermediate revision by the same user not shown)
Line 3: Line 3:
Înainte să dispară, Iepurele Alb îi dădu o cheie aurie inscripţionată cu cifra K şi o avertiză că poate deschide cu această cheie doar uşile cu numere magice ce pot fi reduse la cifra K.
Înainte să dispară, Iepurele Alb îi dădu o cheie aurie inscripţionată cu cifra K şi o avertiză că poate deschide cu această cheie doar uşile cu numere magice ce pot fi reduse la cifra K.


'''''<u>Cerinţe.</u>'''''
== Cerinţe ==
 
Scrieţi un program care să citească numerele naturale N, K şi cele N numere naturale scrise pe cele N uşi, şi care să determine:
Scrieţi un program care să citească numerele naturale N, K şi cele N numere naturale scrise pe cele N uşi, şi care să determine:


Line 11: Line 10:
b) numărul uşilor care pot fi deschise cu cheia aurie inscripţionată cu cifra K.
b) numărul uşilor care pot fi deschise cu cheia aurie inscripţionată cu cifra K.


'''''<u>Date de intrare</u>'''''
== Date de intrare ==
 
Programul citește de la tastatură numerele N şi K și apoi N numere naturale reprezentând numerele scrise pe cele N uşi.
Programul citește de la tastatură numerele N şi K și apoi N numere naturale reprezentând numerele scrise pe cele N uşi.


'''''<u>Date de ieșire</u>'''''
== Date de ieșire ==
 
Programul va afișa pe ecran, în această ordine:
Programul va afișa pe ecran, în această ordine:


un număr natural reprezentând cel mai mare număr par dintre numerele scrise pe cele N uşi;
* un număr natural reprezentând cel mai mare număr par dintre numerele scrise pe cele N uşi;
 
* un număr natural reprezentând numărul uşilor care pot fi deschise cu cheia aurie inscripţionată cu cifra K.
un număr natural reprezentând numărul uşilor care pot fi deschise cu cheia aurie inscripţionată cu cifra K.


'''''<u>Restricții și precizări</u>'''''
== Restricții și precizări ==


complementarea cifrelor unui număr natural faţă de cifra sa maximă din scrierea zecimală constă în înlocuirea fiecărei cifre c din număr cu diferenţa dintre cifra maximă şi cifra c; de exemplu, cifra maximă a numărului 1234 este 4 iar prin complementare se înlocuieşte cifra 1 cu 3(=4-1), cifra 2 cu 2(=4-2), cifra 3 cu 1 (=4-3) şi cifra 4 cu 0(=4-4) rezultând numărul 3210;
* complementarea cifrelor unui număr natural faţă de cifra sa maximă din scrierea zecimală constă în înlocuirea fiecărei cifre c din număr cu diferenţa dintre cifra maximă şi cifra c; de exemplu, cifra maximă a numărului 1234 este 4 iar prin complementare se înlocuieşte cifra 1 cu 3(=4-1), cifra 2 cu 2(=4-2), cifra 3 cu 1 (=4-3) şi cifra 4 cu 0(=4-4) rezultând numărul 3210;
* 7 ≤ N ≤ 10000; ≤0 ≤ K ≤ 9;
* pe fiecare uşă este scris un singur număr natural;
* există cel puţin o uşă pe care este scris un număr par;
* numărul scris pe oricare uşă (din cele N) este mai mare sau egal cu 10 şi mai mic sau egal cu 32800;
* pentru rezolvarea corectă a cerinţei a) se acordă 20% din punctaj, iar pentru rezolvarea corectă a ambelor cerinţe se acordă 100% din punctaj.


7 ≤ N ≤ 10000; ≤0 ≤ K ≤ 9;
== Exemplu: ==
 
'''Intrare'''
pe fiecare uşă este scris un singur număr natural;
 
există cel puţin o uşă pe care este scris un număr par;
 
numărul scris pe oricare uşă (din cele N) este mai mare sau egal cu 10 şi mai mic sau egal cu 32800;
 
pentru rezolvarea corectă a cerinţei a) se acordă 20% din punctaj, iar pentru rezolvarea corectă a ambelor cerinţe se acordă 100% din punctaj.
 
'''''<u>Exemplu:</u>'''''
 
Intrare


7 1
7 1
Line 45: Line 35:
1204 1234 13 195 23 10 888
1204 1234 13 195 23 10 888


Ieșire
'''Ieșire'''


1234
1234
Line 51: Line 41:
3
3


'''''<u>Explicație</u>'''''
== Explicație ==
 
a) Sunt N=7 uşi pe care sunt scrise numerele 1204, 1234, 13, 195, 23, 10, 888. Cel mai mare număr par dintre cele scrise pe uşi este 1234.
a) Sunt N=7 uşi pe care sunt scrise numerele 1204, 1234, 13, 195, 23, 10, 888. Cel mai mare număr par dintre cele scrise pe uşi este 1234.


b) Cheia primită este inscripţionată cu cifra K=1 şi deschide 3 uşi cu numerele 1234, 23 şi 10 deoarece numerele magice dintre cele scrise pe uşi sunt: 1234 (1234→3210→123→210→12→10→1), 13 (13→20→2), 195 (195→804→84→4), 23 (23→10→1), 10 (10→1), 888 (888→0). Numărul 1204 nu este un număr magic.
b) Cheia primită este inscripţionată cu cifra K=1 şi deschide 3 uşi cu numerele 1234, 23 şi 10 deoarece numerele magice dintre cele scrise pe uşi sunt: 1234 (1234→3210→123→210→12→10→1), 13 (13→20→2), 195 (195→804→84→4), 23 (23→10→1), 10 (10→1), 888 (888→0). Numărul 1204 nu este un număr magic.


'''''<u>Rezolvare</u>'''''<syntaxhighlight lang="python">
== Rezolvare ==
# Se citesc două numere, n și k, separate prin spațiu
<syntaxhighlight lang="python">
n, k = map(int, input().split())
def validare_date(n, k, numere):
    if not (7 <= n <= 10000) or not (0 <= k <= 9) or not any(x % 2 == 0 for x in numere) or not all(10 <= x <= 32800 for x in numere):
        print("Datele introduse nu respecta conditiile problemei.")
        return False


# Inițializarea unor variabile pentru a ține evidența valorii maxime a unui număr par și numărul de valori care îndeplinesc condiția
    return True
maxpar = 0
nr = 0


# Iteram de n ori
def prelucreaza_numerele(n, k, numere):
for _ in range(n):
     maxpar = 0
     # Se citește un număr a de la tastatură
     nr = 0
    a = int(input())
     x = z = a  # x și z sunt copii ale lui a, necesare pentru calculul iterativ


     # Se verifică dacă a este par și mai mare decât maxpar
     for a in numere:
    if a % 2 == 0 and maxpar < a:
        x = z = a
        maxpar = a
        if a % 2 == 0 and maxpar < a:
            maxpar = a
        while True:
            a, z = z, x
            cmax = 0
            nc = 0
            while x:
                c = x % 10
                x = x // 10
                nc += 1


    # Se începe un ciclu infinit
                if c > cmax:
    while True:
                    cmax = c
        a, z = z, x  # a devine z, iar z devine x, pentru a pregăti următoarea iterație
        cmax = 0  # Variabilă pentru a reține cifra maximă din număr
        nc = 0  # Variabilă pentru a reține numărul de cifre în numărul curent


        # Se parcurge fiecare cifră a lui x
             nrmax = 0
        while x:
             c = x % 10
            x = x // 10
            nc += 1  # Se numără cifrele


             # Se actualizează cifra maximă dacă este cazul
             for i in range(1, nc + 1):
            if c > cmax:
                 nrmax = nrmax * 10 + cmax
                 cmax = c


        nrmax = 0
            x = nrmax - z


        # Se construiește un număr format doar din cifra maximă
            if x <= 9 or x == z or x == a:
        for i in range(1, nc + 1):
                break
            nrmax = nrmax * 10 + cmax


         # Se calculează următoarea valoare
         if x == k:
        x = nrmax - z
            nr += 1


        # Se verifică condițiile de oprire
    return maxpar, nr
        if x <= 9 or x == z or x == a:
            break


    # Se verifică dacă x este egal cu k și se actualizează numărul de valori care îndeplinesc această condiție
if __name__ == "__main__":
    if x == k:
    n, k = map(int, input().split())
        nr += 1
    numere = list(map(int, input().split()))


# Se afișează valoarea maximă a unui număr par și numărul de valori care îndeplinesc condiția x == k
    if validare_date(n, k, numere):
print(maxpar)
        rezultat_maxpar, rezultat_nr = prelucreaza_numerele(n, k, numere)
print(nr)
        print(rezultat_maxpar)
        print(rezultat_nr)
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 23:05, 2 January 2024

Într-o zi frumoasă de vară, Alice se juca în parc. Deodată, văzu un iepure cu ceas, numit Iepurele Alb, sărind grăbit în scorbura unui copac. Curioasă, Alice îl urmări şi sări şi ea în scorbură. Spre mirarea ei, ajunse într-o sală mare cu N uşi încuiate. Pe fiecare uşă era scris câte un număr natural. Într-o clipă, lângă ea apăru Iepurele Alb şi-i spuse că doar uşile cu numere magice pot fi deschise dacă are cheile potrivite. Pentru a o ajuta, Iepurele Alb i-a explicat că un număr magic este un număr natural care poate fi redus la o cifră prin complementarea cifrelor acestuia faţă de cifra sa maximă din scrierea zecimală, apoi prin complementarea cifrelor numărului obţinut faţă de cifra sa maximă şi aşa mai departe până când se obţine o cifră. Evident, nu toate numerele naturale sunt numere magice. De exemplu, uşa cu numărul 1234 poate fi deschisă cu cheia inscripţionată cu cifra 1 deoarece 1234 este un număr magic ce poate fi redus la cifra 1 prin complementări repetate (1234→3210→123→210→12→10→1), iar uşa cu numărul 1204 nu poate fi deschisă deoarece 1204 nu este un număr magic (indiferent de câte ori s-ar repeta complementarea nu poate fi redus la o cifră: 1204→3240→1204→3240→1204 ... ).

Înainte să dispară, Iepurele Alb îi dădu o cheie aurie inscripţionată cu cifra K şi o avertiză că poate deschide cu această cheie doar uşile cu numere magice ce pot fi reduse la cifra K.

Cerinţe[edit | edit source]

Scrieţi un program care să citească numerele naturale N, K şi cele N numere naturale scrise pe cele N uşi, şi care să determine:

a) cel mai mare număr par dintre numerele scrise pe cele N uşi;

b) numărul uşilor care pot fi deschise cu cheia aurie inscripţionată cu cifra K.

Date de intrare[edit | edit source]

Programul citește de la tastatură numerele N şi K și apoi N numere naturale reprezentând numerele scrise pe cele N uşi.

Date de ieșire[edit | edit source]

Programul va afișa pe ecran, în această ordine:

  • un număr natural reprezentând cel mai mare număr par dintre numerele scrise pe cele N uşi;
  • un număr natural reprezentând numărul uşilor care pot fi deschise cu cheia aurie inscripţionată cu cifra K.

Restricții și precizări[edit | edit source]

  • complementarea cifrelor unui număr natural faţă de cifra sa maximă din scrierea zecimală constă în înlocuirea fiecărei cifre c din număr cu diferenţa dintre cifra maximă şi cifra c; de exemplu, cifra maximă a numărului 1234 este 4 iar prin complementare se înlocuieşte cifra 1 cu 3(=4-1), cifra 2 cu 2(=4-2), cifra 3 cu 1 (=4-3) şi cifra 4 cu 0(=4-4) rezultând numărul 3210;
  • 7 ≤ N ≤ 10000; ≤0 ≤ K ≤ 9;
  • pe fiecare uşă este scris un singur număr natural;
  • există cel puţin o uşă pe care este scris un număr par;
  • numărul scris pe oricare uşă (din cele N) este mai mare sau egal cu 10 şi mai mic sau egal cu 32800;
  • pentru rezolvarea corectă a cerinţei a) se acordă 20% din punctaj, iar pentru rezolvarea corectă a ambelor cerinţe se acordă 100% din punctaj.

Exemplu:[edit | edit source]

Intrare

7 1

1204 1234 13 195 23 10 888

Ieșire

1234

3

Explicație[edit | edit source]

a) Sunt N=7 uşi pe care sunt scrise numerele 1204, 1234, 13, 195, 23, 10, 888. Cel mai mare număr par dintre cele scrise pe uşi este 1234.

b) Cheia primită este inscripţionată cu cifra K=1 şi deschide 3 uşi cu numerele 1234, 23 şi 10 deoarece numerele magice dintre cele scrise pe uşi sunt: 1234 (1234→3210→123→210→12→10→1), 13 (13→20→2), 195 (195→804→84→4), 23 (23→10→1), 10 (10→1), 888 (888→0). Numărul 1204 nu este un număr magic.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python"> def validare_date(n, k, numere):

   if not (7 <= n <= 10000) or not (0 <= k <= 9) or not any(x % 2 == 0 for x in numere) or not all(10 <= x <= 32800 for x in numere):
       print("Datele introduse nu respecta conditiile problemei.")
       return False
   return True

def prelucreaza_numerele(n, k, numere):

   maxpar = 0
   nr = 0
   for a in numere:
       x = z = a
       if a % 2 == 0 and maxpar < a:
           maxpar = a
       while True:
           a, z = z, x
           cmax = 0
           nc = 0
           while x:
               c = x % 10
               x = x // 10
               nc += 1
               if c > cmax:
                   cmax = c
           nrmax = 0
           for i in range(1, nc + 1):
               nrmax = nrmax * 10 + cmax
           x = nrmax - z
           if x <= 9 or x == z or x == a:
               break
       if x == k:
           nr += 1
   return maxpar, nr

if __name__ == "__main__":

   n, k = map(int, input().split())
   numere = list(map(int, input().split()))
   if validare_date(n, k, numere):
       rezultat_maxpar, rezultat_nr = prelucreaza_numerele(n, k, numere)
       print(rezultat_maxpar)
       print(rezultat_nr)

</syntaxhighlight>