4021 - Tablou 1: Difference between revisions

From Bitnami MediaWiki
No edit summary
Line 3: Line 3:
Generaţi un tablou bidimensional cu proprietăţile:
Generaţi un tablou bidimensional cu proprietăţile:


*conţine N linii şi N coloane;
*conţine '''N''' linii şi '''N''' coloane;
*elementele sale sunt numere naturale nenule;
*elementele sale sunt numere naturale nenule;
*suma elementelor este egală cu numărul natural nenul S;
*suma elementelor este egală cu numărul natural nenul S;
Line 11: Line 11:
== Date de intrare ==
== Date de intrare ==


Fișierul de intrare tablou.txt conţine pe prima linie două numere naturale nenule N S, separate printr-un spaţiu, reprezentând numărul de linii şi de coloane ale tabloului, respectiv valoarea sumei tuturor elementelor din tablou.
Fișierul de intrare '''tablouin.txt''' conţine pe prima linie două numere naturale nenule '''N S''', separate printr-un spaţiu, reprezentând numărul de linii şi de coloane ale tabloului, respectiv valoarea sumei tuturor elementelor din tablou.


== Date de iesire ==
== Date de iesire ==


Fișierul de ieșire tablou.txt va conţine N linii pe care se vor scrie elementele tabloului, câte o linie din tablou pe o linie din fişier; elementele de pe aceeaşi linie se vor separa prin câte un spaţiu.
Fișierul de ieșire '''tablouout.txt''' va conţine N linii pe care se vor scrie elementele tabloului, câte o linie din tablou pe o linie din fişier; elementele de pe aceeaşi linie se vor separa prin câte un spaţiu.


== Restrictii si precizari ==
== Restrictii si precizari ==


*1 < N 100
*'''1 < N &les; 100'''
*0 < S < 2^31
*''''0 < S < 2^31'''
*Dacă problema nu are soluţie, în fişierul de ieşire se va scrie cifra 0.
*Dacă problema nu are soluţie, în fişierul de ieşire se va scrie cifra 0.
*Dacă problema are mai multe soluţii, în fişier se va scrie una singură.
*Dacă problema are mai multe soluţii, în fişier se va scrie una singură.


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;tablouin.txt
:3 51
:3 51


;Iesire
;tablouout.txt
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
:4 6 7  
:4 6 7  
:7 4 6  
:7 4 6  
Line 35: Line 35:


== Exemplul 2 ==
== Exemplul 2 ==
;Intrare
;tablouin.txt
:0 -10
:0 -10
;Iesire
:Datele introduse nu corespund restrictiilor impuse
;Datele introduse nu corespund restrictiilor impuse





Revision as of 09:37, 27 December 2023

Cerinta

Generaţi un tablou bidimensional cu proprietăţile:

  • conţine N linii şi N coloane;
  • elementele sale sunt numere naturale nenule;
  • suma elementelor este egală cu numărul natural nenul S;
  • pe nici o linie şi pe nici o coloană nu există două elemente identice;
  • diferenţa dintre cel mai mare şi cel mai mic element ale tabloului este minimă.

Date de intrare

Fișierul de intrare tablouin.txt conţine pe prima linie două numere naturale nenule N S, separate printr-un spaţiu, reprezentând numărul de linii şi de coloane ale tabloului, respectiv valoarea sumei tuturor elementelor din tablou.

Date de iesire

Fișierul de ieșire tablouout.txt va conţine N linii pe care se vor scrie elementele tabloului, câte o linie din tablou pe o linie din fişier; elementele de pe aceeaşi linie se vor separa prin câte un spaţiu.

Restrictii si precizari

  • 1 < N ⩽ 100
  • '0 < S < 2^31
  • Dacă problema nu are soluţie, în fişierul de ieşire se va scrie cifra 0.
  • Dacă problema are mai multe soluţii, în fişier se va scrie una singură.

Exemplul 1

tablouin.txt
3 51
tablouout.txt
Datele introduse corespund restrictiilor impuse
4 6 7
7 4 6
6 7 4

Exemplul 2

tablouin.txt
0 -10
Datele introduse nu corespund restrictiilor impuse


Rezolvare

<syntaxhighlight lang="python3" line="1"> def generare_tablou(N, S):

   if N == 1:
       return S
   
   tablou = [[0] * N for _ in range(N)]
   
   # Generare linie 1
   for i in range(1, N):
       tablou[0][i] = 1
   
   # Generare coloana 1
   for i in range(1, N):
       tablou[i][0] = 1
   
   # Calcul diferență minimă între cel mai mare și cel mai mic element
   dif_minima = (S - N) // (N - 1)
   
   # Calcul suma elementelor de pe diagonala principala
   suma_diagonala_principala = (N - 1) * dif_minima + N
   
   # Completare elemente diagonala principala
   for i in range(1, N):
       tablou[i][i] = dif_minima + 1
   
   # Completare elemente diagonala secundara
   for i in range(N - 1):
       tablou[i][N - 1 - i] = 1
   
   # Ajustare ultimul element pentru a asigura suma dorită
   tablou[N - 1][0] = S - suma_diagonala_principala
   
   return tablou
  1. Citire date de intrare

with open("tablou.txt", "r") as fin:

   N, S = map(int, fin.readline().split())
  1. Generare tablou

rezultat = generare_tablou(N, S)

  1. Scriere rezultat in fisier

with open("tablou.txt", "w") as fout:

   for linie in rezultat:
       fout.write(" ".join(map(str, linie)) + "\n")

</syntaxhighlight>