1061 - Cifru1

From Bitnami MediaWiki
Revision as of 22:26, 4 January 2024 by Miawinator (talk | contribs) (Pagină nouă: Costel a descoperit într-o debara servieta cu cifru a tatălui său. Cifrul este compus din <code>4</code> discuri metalice pe care sunt inscripţionate cifrele de la <code>0</code> la <code>9</code>. Fiecare disc se poate mişca individual, de sus în jos sau de jos în sus, formându-se combinaţii de cifre. De multe ori, datorită comodităţii, combinaţia ce permite deschiderea servietei este formată numai din cifre identice: <code>0000</code>, <code>1111</code> etc....)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Costel a descoperit într-o debara servieta cu cifru a tatălui său. Cifrul este compus din 4 discuri metalice pe care sunt inscripţionate cifrele de la 0 la 9. Fiecare disc se poate mişca individual, de sus în jos sau de jos în sus, formându-se combinaţii de cifre. De multe ori, datorită comodităţii, combinaţia ce permite deschiderea servietei este formată numai din cifre identice: 0000, 1111 etc.

Costel îşi imaginează un cifru compus din N discuri metalice, fiecare având inscripţionate cifrele de la 0 la 9, fiecare putând fi deplasat în cele două direcţii specificate anterior. Prin mutare Costel înţelege deplasarea unui disc în sus sau în jos, cu o singură poziţie, adică deplasarea discului până la cifra precedentă, respectiv următoare celei curente.

Cerința[edit | edit source]

Realizaţi un program care, cunoscând poziţia iniţială a fiecărui disc dintre cele N discuri ale cifrului, determină şi afişează:

a) cifra cea mai mare care apare pe discurile cifrului în forma iniţială;

b)

b1) numărul minim de mutări necesare pentru ca numărul obţinut pe cifru să fie compus numai din cifre identice, număr necesar deschiderii servietei;

b2) cifra cea mai mică ce se poate obţine în urma efectuării numărului minim de mutări determinat;

b3) numărul de combinaţii formate din cifre identice, care se poate obţine în urma efectuării numărului minim de mutări determinat.

Date de intrare[edit | edit source]

Fișierul de intrare input.txt conține:

  • pe prima linie numărul natural N reprezentând numărul discurilor;
  • pe următoarele N linii câte o cifră, reprezentând cifra curentă de pe fiecare disc al cifrului.

Date de ieșire[edit | edit source]

Fișierul de ieșire output.txt va conține, pe linii separate, cele 4 valori solicitate.

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

  • 1 < N ≤ 100 000
  • Un disc poate să rămână nemişcat.

Exemplul 1[edit | edit source]

input.txt:

4

7

3

9

0

output.txt:

9

7

0

2

Explicație:

Avem un cifru cu 4 discuri. Iniţial, cifrul este în starea 7390 (primul disc este poziţionat pe cifra 7, al doilea pe cifra 3 etc.)

Cea mai mare cifră de pe cifru este cifra 9.

Numărul minim de mutări este 7 şi se poate obţine în două moduri:

  1. Deplasăm primul disc cu 2 poziţii în sus, al doilea disc cu 4 poziţii în jos, al treilea rămâne nemişcat, iar ultimul se deplasează cu o poziţie în jos. Combinaţia obţinută este 9999.
  2. Deplasăm primul disc cu 3 poziţii în sus, al doilea disc cu 3 poziţii în jos, al treilea cu o poziţie în sus, iar ultimul rămâne nemişcat. Combinaţia obţinută este 0000.

Astfel, cifra cea mai mică ce formează combinaţia cu număr minim de mutări este 0. Avem 2 combinaţii care se pot obţine în numărul minim de mutări determinat: 0000 şi 9999.

Exemplul 2[edit | edit source]

input.txt:

99999999999999

7

3

9

0

Output:

Input-ul nu convine conditiilor

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def verificare(n):

   if not(1<=n<=100000):
       print("Input-ul nu convine conditiilor")
       exit()

Fin = "input.txt" Fou = "output.txt"

with open(Fin, "r") as IN, open(Fou, "w") as OUT:

   N = int(IN.readline())
   verificare(N)
   Apar = [0] * 10  # Apar[i] = 1 if color i appears on at least one disc
   MAX = 0          # maximum digit
   NrMin = 10 * N + 1  # minimum number of moves
   Cif = -1         # digit obtained in the minimum number of moves
   Cate = 0         # number of possibilities
   # initialize
   for i in range(10):
       Apar[i] = 0
   # read input data and determine initially appearing digits and maximum digit
   for i in range(1, N + 1):
       x = int(IN.readline())
       Apar[x] += 1
       if MAX < x:
           MAX = x
   # calculate the number of moves for each appearing digit
   for i in range(10):
       Nr = 0
       for j in range(10):
           if Apar[j] and j != i:
               Nr += min(abs(j - i), 10 - abs(j - i)) * Apar[j]
       if Nr < NrMin:
           NrMin = Nr
           Cif = i
           Cate = 1
       elif Nr == NrMin:
           Cate += 1
   OUT.write(f"{MAX}\n{NrMin}\n{Cif}\n{Cate}\n")

</syntaxhighlight>