4021 - Tablou 1: Diferență între versiuni

De la Universitas MediaWiki
Fără descriere a modificării
Linia 3: Linia 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;
Linia 11: Linia 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  
Linia 35: Linia 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





Versiunea de la data 27 decembrie 2023 09:37

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

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

# Citire date de intrare
with open("tablou.txt", "r") as fin:
    N, S = map(int, fin.readline().split())

# Generare tablou
rezultat = generare_tablou(N, S)

# Scriere rezultat in fisier
with open("tablou.txt", "w") as fout:
    for linie in rezultat:
        fout.write(" ".join(map(str, linie)) + "\n")