1061 - Cifru1

De la Universitas MediaWiki
Versiunea pentru tipărire nu mai este suportată și poate avea erori de randare. Vă rugăm să vă actualizați bookmarkurile browserului și să folosiți funcția implicită de tipărire a browserului.

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

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

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

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

Restricții și precizări

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

Exemplul 1

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

input.txt:

99999999999999

7

3

9

0

Output:

Input-ul nu convine conditiilor

Rezolvare

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")