1968 - Bloc

From Bitnami MediaWiki

Cerinţa[edit | edit source]

Cifrele de la 1 la K se scriu într-un şir, iar secvenţa obţinută se repetă la nesfârşit. De exemplu, pentru K=9 se obţine şirul: 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 …. Asupra unui asemenea şir se aplică succesiv operaţia de rostogolire de lungime P, ce presupune ca blocul format cu cifrele de pe primele P poziţii să se rotească cu 1800 şi să se scrie deasupra următoarei secvenţe de lungime P. În cazul exemplului anterior, pentru P=3, vom obţine după 4 operaţii de rostogolire de lungime 3: Pas 1: 3 2 1

    4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9…

Pas 2: 6 5 4

    1 2 3
    7 8 9 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9…

Pas 3: 9 8 7

    3 2 1
    4 5 6
    1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9…

Pas 4: 3 2 1

    6 5 4
    1 2 3
    7 8 9
    4 5 6 7 8 9 1 2 3 4 5 6 7 8 9…

Astfel pe primele P poziţii se formează un bloc având la bază P cifre şi înălţimea N+1, unde N este numărul de rostogoliri de lungime P. Pentru K, P şi N date se cer următoarele: a) Suma elementelor blocului după N rostogoliri de lungime P. b) Suma maximă a elementelor de pe o coloană a blocului după N rostogoliri de lungime P. c) Dacă liniile blocului le privim ca pe nişte numere cu P cifre, să se afle cel mai mic dintre aceste numere ale blocului obţinut după N rostogoliri de lungime P.

Date de intrare[edit | edit source]

Fişierul de intrare bloc.in conţine pe prima linie numerele K, P şi N ce reprezintă cifra maximă din şirul iniţial, lungimea secvenţei care se rostogoleşte, respectiv numărul de rostogoliri.

Date de ieșire[edit | edit source]

Fişierul de ieşire bloc.out va conţine pe prima linie suma elementelor blocului după N rostogoliri, pe a doua linie suma maximă a elementelor unei coloane a blocului după N rostogoliri, iar pe a treia linie numărul minim format din cifrele unei linii a blocului după N rostogoliri.

Restricţii şi precizări[edit | edit source]

  • 1 ≤ K ≤ 9
  • 1 ≤ P ≤ 100
  • 1 ≤ N ≤ 1.000.000
  • Prima cerinţă se notează cu 40p, a doua cu 40p, iar a treia cu 20p

Exemplul 1[edit | edit source]

bloc.in
 9 3 4
bloc.out
 66
 23
 123

Explicație[edit | edit source]

Datele corespund exemplului de mai sus. La pasul 4 suma elementelor blocului este 66, coloana a treia a blocului are suma 1+4+3+9+6=23 care este maximă, iar cifrele de pe linia a treia a blocului formează numărul minim 123.


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def rotate_sequence(sequence, P):

   return sequence[P-1::-1] + sequence[P:]

def rotate_block(block, P):

   return [rotate_sequence(row, P) for row in block]

def sum_block(block):

   return sum(sum(row) for row in block)

def max_column_sum(block):

   max_sum = 0
   for j in range(len(block[0])):
       column_sum = sum(block[i][j] for i in range(len(block)))
       max_sum = max(max_sum, column_sum)
   return max_sum

def min_line_number(block):

   min_number = int(.join(map(str, block[0])))
   for row in block[1:]:
       number = int(.join(map(str, row)))
       min_number = min(min_number, number)
   return min_number

def main():

   with open("bloc.in", "r") as fin:
       K, P, N = map(int, fin.readline().split())
   sequence = [i % K + 1 for i in range(K * 2)]
   block = [sequence[i:i+P] for i in range(0, P*(N+1), P)]
   for _ in range(N):
       block = rotate_block(block, P)
   sum_elements = sum_block(block)
   max_column = max_column_sum(block)
   min_line = min_line_number(block)
   with open("bloc.out", "w") as fout:
       fout.write(f"{sum_elements}\n")
       fout.write(f"{max_column}\n")
       fout.write(f"{min_line}\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>