3686 - Vaccination: Difference between revisions

From Bitnami MediaWiki
Andrada378 (talk | contribs)
Pagină nouă: <u>''Cerință''</u> Echipa V.R.N.C. a dezvoltat un vaccin contra celei mai recente boli. Vaccinul este distribuit mai întâi unei singure persoane, iar mai apoi se împrăștie celor 4 vecini(populația este reprezentată pe o matrice de dimensiunile n și m). Ulterior, fiecare persoana va da vaccinul celor 4 vecini până când o persoană de la marginea matricii este vaccinată, moment în care vaccinul nu mai este dat mai departe. Vazând succesul acestei metode, V.R.N...
 
Andrada378 (talk | contribs)
No edit summary
Line 1: Line 1:
<u>''Cerință''</u>
== Cerința ==
 
Echipa V.R.N.C. a dezvoltat un vaccin contra celei mai recente boli. Vaccinul este distribuit mai întâi unei singure persoane, iar mai apoi se împrăștie celor 4 vecini(populația este reprezentată pe o matrice de dimensiunile n și m). Ulterior, fiecare persoana va da vaccinul celor 4 vecini până când o persoană de la marginea matricii este vaccinată, moment în care vaccinul nu mai este dat mai departe.
Echipa V.R.N.C. a dezvoltat un vaccin contra celei mai recente boli. Vaccinul este distribuit mai întâi unei singure persoane, iar mai apoi se împrăștie celor 4 vecini(populația este reprezentată pe o matrice de dimensiunile n și m). Ulterior, fiecare persoana va da vaccinul celor 4 vecini până când o persoană de la marginea matricii este vaccinată, moment în care vaccinul nu mai este dat mai departe.


Vazând succesul acestei metode, V.R.N.C ne dă o matrice în care știm vârsta fiecărei persoane și trebuie să aflăm punctul unde V.R.N.C ar trebui să înceapă distribuția vaccinului astfel încât să maximizăm suma vârstelor oamenilor vaccinați.
Vazând succesul acestei metode, V.R.N.C ne dă o matrice în care știm vârsta fiecărei persoane și trebuie să aflăm punctul unde V.R.N.C ar trebui să înceapă distribuția vaccinului astfel încât să maximizăm suma vârstelor oamenilor vaccinați.


<u>''Date de intrare''</u>
== Date de intrare ==
 
Programul citește de la tastatură pe prima linie numerele n și m, iar apoi n linii, fiecare linie conținând m numere separate prin spații, reprezentând vârstele celor n*m cetățeni
Programul citește de la tastatură pe prima linie numerele n și m, iar apoi n linii, fiecare linie conținând m numere separate prin spații, reprezentând vârstele celor n*m cetățeni


<u>''Date de ieșire''</u>
== Date de ieșire ==
 
Programul va afișa pe ecran două valori i și j, locul unde vaccinarea ar trebui să înceapă. Dacă sunt mai multe soluții, trebuie afișată cea mai din stânga-sus poziție.
Programul va afișa pe ecran două valori i și j, locul unde vaccinarea ar trebui să înceapă. Dacă sunt mai multe soluții, trebuie afișată cea mai din stânga-sus poziție.


Restricții și precizări
== Restricții și precizări ==
 
1 ≤ n, m ≤ 1000


cele n*m numere citite vor fi între 0 și 2147483647
* 1 ≤ n, m ≤ 1000
* cele n*m numere citite vor fi între 0 și 2147483647


<u>''Exemplu:''</u>
== Exemplu: ==
 
'''Intrare'''
<u>''Intrare''</u>


3 4
3 4
Line 31: Line 26:
9 10 11 12
9 10 11 12


<u>''Ieșire''</u>
'''Ieșire'''


2 3
2 3


<u>''Explicație''</u>
== Explicație ==
 
Începând de la celula (2, 3) cu valoarea 7, vaccinul va ajunge și la valorile 3, 6, 8 și 11, suma fiind 35, aceasta fiind suma maximă posibilă obținută.
Începând de la celula (2, 3) cu valoarea 7, vaccinul va ajunge și la valorile 3, 6, 8 și 11, suma fiind 35, aceasta fiind suma maximă posibilă obținută.


<u>''Rezolvare''</u>
== Rezolvare ==
 
<syntaxhighlight lang="python">
def get_vecini(matrice, i, j):
def get_vecini(matrice, i, j):


    vecini = []
    vecini = []


    randuri, coloane = len(matrice), len(matrice[0])
    randuri, coloane = len(matrice), len(matrice[0])


    # Verificăm vecinii de sus, jos, stânga și dreapta și îi adăugăm în lista "vecini"
    if i > 0:


    if i > 0:
        vecini.append(matrice[i - 1][j])


        vecini.append(matrice[i - 1][j])
    if i < randuri - 1:


    if i < randuri - 1:
        vecini.append(matrice[i + 1][j])


        vecini.append(matrice[i + 1][j])
    if j > 0:


    if j > 0:
        vecini.append(matrice[i][j - 1])


        vecini.append(matrice[i][j - 1])
    if j < coloane - 1:


    if j < coloane - 1:
        vecini.append(matrice[i][j + 1])


        vecini.append(matrice[i][j + 1])
    return vecini
 
    return vecini


def maximizeaza_distributia_vaccinului(matrice):
def maximizeaza_distributia_vaccinului(matrice):


    suma_maxima = 0
    suma_maxima = 0
 
    start_i, start_j = 0, 0
 
    randuri, coloane = len(matrice), len(matrice[0])
 
    # Iterăm prin matrice, excludem marginea superioară și inferioară
 
    for i in range(1, randuri - 1):


        for j in range(coloane):
    start_i, start_j = 0, 0


            # Calculăm suma vârstei curente și a vecinilor
    randuri, coloane = len(matrice), len(matrice[0])


            suma_curenta = matrice[i][j]
    for i in range(1, randuri - 1):


            vecini = get_vecini(matrice, i, j)
        for j in range(coloane):


            suma_curenta += sum(vecini)
            suma_curenta = matrice[i][j]


            # Verificăm dacă suma curentă este mai mare decât suma maximă
            vecini = get_vecini(matrice, i, j)


            if suma_curenta > suma_maxima:
            suma_curenta += sum(vecini)


                suma_maxima = suma_curenta
            if suma_curenta > suma_maxima:


                start_i, start_j = i, j
                suma_maxima = suma_curenta


    return start_i, start_j + 1  # Adăugăm 1 pentru a afișa poziția corectă
                start_i, start_j = i, j


<nowiki>#</nowiki> Citire date de intrare
    return start_i, start_j + 1 


n, m = map(int, input().split())
n, m = map(int, input().split())
Line 105: Line 89:
varste_matrice = [list(map(int, input().split())) for _ in range(n)]
varste_matrice = [list(map(int, input().split())) for _ in range(n)]


<nowiki>#</nowiki> Calcul și afișare rezultat


start_i, start_j = maximizeaza_distributia_vaccinului(varste_matrice)
start_i, start_j = maximizeaza_distributia_vaccinului(varste_matrice)


print(f"Locul de start pentru vaccinare: ({start_i + 1}, {start_j})")
print(f"Locul de start pentru vaccinare: ({start_i + 1}, {start_j})")
</syntaxhighlight>

Revision as of 20:27, 2 January 2024

Cerința

Echipa V.R.N.C. a dezvoltat un vaccin contra celei mai recente boli. Vaccinul este distribuit mai întâi unei singure persoane, iar mai apoi se împrăștie celor 4 vecini(populația este reprezentată pe o matrice de dimensiunile n și m). Ulterior, fiecare persoana va da vaccinul celor 4 vecini până când o persoană de la marginea matricii este vaccinată, moment în care vaccinul nu mai este dat mai departe.

Vazând succesul acestei metode, V.R.N.C ne dă o matrice în care știm vârsta fiecărei persoane și trebuie să aflăm punctul unde V.R.N.C ar trebui să înceapă distribuția vaccinului astfel încât să maximizăm suma vârstelor oamenilor vaccinați.

Date de intrare

Programul citește de la tastatură pe prima linie numerele n și m, iar apoi n linii, fiecare linie conținând m numere separate prin spații, reprezentând vârstele celor n*m cetățeni

Date de ieșire

Programul va afișa pe ecran două valori i și j, locul unde vaccinarea ar trebui să înceapă. Dacă sunt mai multe soluții, trebuie afișată cea mai din stânga-sus poziție.

Restricții și precizări

  • 1 ≤ n, m ≤ 1000
  • cele n*m numere citite vor fi între 0 și 2147483647

Exemplu:

Intrare

3 4

1 2 3 4

5 6 7 8

9 10 11 12

Ieșire

2 3

Explicație

Începând de la celula (2, 3) cu valoarea 7, vaccinul va ajunge și la valorile 3, 6, 8 și 11, suma fiind 35, aceasta fiind suma maximă posibilă obținută.

Rezolvare

<syntaxhighlight lang="python"> def get_vecini(matrice, i, j):

   vecini = []
   randuri, coloane = len(matrice), len(matrice[0])
   if i > 0:
       vecini.append(matrice[i - 1][j])
   if i < randuri - 1:
       vecini.append(matrice[i + 1][j])
   if j > 0:
       vecini.append(matrice[i][j - 1])
   if j < coloane - 1:
       vecini.append(matrice[i][j + 1])
   return vecini

def maximizeaza_distributia_vaccinului(matrice):

   suma_maxima = 0
   start_i, start_j = 0, 0
   randuri, coloane = len(matrice), len(matrice[0])
   for i in range(1, randuri - 1):
       for j in range(coloane):
           suma_curenta = matrice[i][j]
           vecini = get_vecini(matrice, i, j)
           suma_curenta += sum(vecini)
           if suma_curenta > suma_maxima:
               suma_maxima = suma_curenta
               start_i, start_j = i, j
   return start_i, start_j + 1  

n, m = map(int, input().split())

varste_matrice = [list(map(int, input().split())) for _ in range(n)]


start_i, start_j = maximizeaza_distributia_vaccinului(varste_matrice)

print(f"Locul de start pentru vaccinare: ({start_i + 1}, {start_j})") </syntaxhighlight>