1061 - Cifru1
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:
- Deplasăm primul disc cu
2
poziţii în sus, al doilea disc cu4
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ă este9999
. - Deplasăm primul disc cu
3
poziţii în sus, al doilea disc cu3
poziţii în jos, al treilea cu o poziţie în sus, iar ultimul rămâne nemişcat. Combinaţia obţinută este0000
.
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>