1856 - Taxe: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Enunt == Într-o ţară în care corupţia este în floare şi economia la pământ, pentru a obţine toate aprobările necesare în scopul demarării unei afaceri, investitorul trebuie să treacă prin mai multe camere ale unei clădiri în care se află birouri. Clădirea are un singur nivel în care birourile sunt lipite unele de altele formând un caroiaj pătrat de dimensiune n•n. Pentru a facilita accesul în birouri, toate camerele vecine au uşi între ele. Î...
 
No edit summary
 
Line 3: Line 3:
Într-o ţară în care corupţia este în floare şi economia la pământ, pentru a obţine toate aprobările necesare în scopul demarării unei afaceri, investitorul trebuie să treacă prin mai multe camere ale unei clădiri în care se află birouri.
Într-o ţară în care corupţia este în floare şi economia la pământ, pentru a obţine toate aprobările necesare în scopul demarării unei afaceri, investitorul trebuie să treacă prin mai multe camere ale unei clădiri în care se află birouri.


Clădirea are un singur nivel în care birourile sunt lipite unele de altele formând un caroiaj pătrat de dimensiune n•n. Pentru a facilita accesul în birouri, toate camerele vecine au uşi între ele. În fiecare birou se află un funcţionar care pretinde o taxă de trecere prin cameră (taxă ce poate fi, pentru unele camere, egală cu 0). Investitorul intră încrezător prin colţul din stânga-sus al clădirii (cum se vede de sus planul clădirii) şi doreşte să ajungă în colţul opus al clădirii, unde este ieşirea, plătind o taxă totală cât mai mică.
Clădirea are un singur nivel în care birourile sunt lipite unele de altele formând un caroiaj pătrat de dimensiune <code>n•n</code>. Pentru a facilita accesul în birouri, toate camerele vecine au uşi între ele. În fiecare birou se află un funcţionar care pretinde o taxă de trecere prin cameră (taxă ce poate fi, pentru unele camere, egală cu <code>0</code>). Investitorul intră încrezător prin colţul din stânga-sus al clădirii (cum se vede de sus planul clădirii) şi doreşte să ajungă în colţul opus al clădirii, unde este ieşirea, plătind o taxă totală cât mai mică.


== Cerinta ==
= Cerința =
Ştiind că el are în buzunar <code>S</code> euro şi că fiecare funcţionar îi ia taxa de cum intră în birou, se cere să se determine dacă el poate primi aprobările necesare şi, în caz afirmativ, care este suma maximă de bani care îi rămâne în buzunar la ieşirea din clădire.


Ştiind că el are în buzunar S euro şi că fiecare funcţionar îi ia taxa de cum intră în birou, se cere să se determine dacă el poate primi aprobările necesare şi, în caz afirmativ, care este suma maximă de bani care îi rămâne în buzunar la ieşirea din clădire.
= Date de intrare =
Fişierul de intrare <code>taxe2IN.txt</code> conţine pe prima linie cele două numere <code>S</code> şi <code>n</code> despărţite printr-un spaţiu, iar pe următoarele <code>n</code> linii câte <code>n</code> numere separate prin spaţii ce reprezintă taxele cerute de funcţionarii din fiecare birou.


== Date de intrare ==
= Date de ieșire =
Fişierul de ieşire <code>taxe2OUT.txt</code> conţine o singură linie pe care se află numărul maxim de euro care îi rămân în buzunar sau valoarea <code>–1</code> dacă investitorului nu-i ajung banii pentru a obţine aprobarea. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".


Fişierul de intrare taxe2.in conţine pe prima linie cele două numere S şi n despărţite printr-un spaţiu, iar pe următoarele n linii câte n numere separate prin spaţii ce reprezintă taxele cerute de funcţionarii din fiecare birou.
= Restricții și precizări =


== Date de ieșire ==
* <code>3 ≤ N ≤ 100</code>
* <code>1 ≤ S ≤ 10000</code>
* Valorile reprezentând taxele cerute de funcţionarii din birouri sunt numere naturale, o taxă nedepășind valoarea de <code>200</code> de euro.


Fişierul de ieşire taxe2.out conţine o singură linie pe care se află numărul maxim de euro care îi rămân în buzunar sau valoarea –1 dacă investitorului nu-i ajung banii pentru a obţine aprobarea.
= Exemplul 1: =
<code>taxe2IN.txt</code>
10 3
1 2 5
1 3 1
0 8 1
<code>taxe2OUT.txt</code>
3


== Restrictii si precizari ==
== Exemplul 2: ==
<code>taxe2IN.txt</code>
2 2
1 2
1 3
<code>taxe2OUT.txt</code>
Datele nu corespund restrictiilor impuse
:


*3 ≤ N ≤ 100
:
*1 ≤ S ≤ 10000
*Valorile reprezentând taxele cerute de funcţionarii din birouri sunt numere naturale, o taxă nedepășind valoarea de 200 de euro.


== Exemplul 1 ==
== Rezolvare ==


;taxe2in.txt
<syntaxhighlight lang="python3" line="1">
 
def read_input(filename="taxe2IN.txt"):
:10 3
    with open(filename, "r") as file:
 
        s, n = map(int, file.readline().split())
:1 2 5
        a = [list(map(int, file.readline().split())) for _ in range(n)]
 
    return s, n, a
:1 3 1
 
:0 8 1


;taxe2out.txt
def write_output(result, filename="taxe2OUT.txt"):
    with open(filename, "w") as file:
        file.write(str(result))


:3
def verify_restrictions(s, n, a):
 
    if not (3 <= n <= 100):
:Datele introduse corespund restrictiilor impus.
        return False
 
    if not (1 <= s <= 10000):
== Exemplul 2 ==
        return False
 
    for row in a:
;taxe2in.txt
        for tax in row:
 
            if not (0 <= tax <= 200):
:0 1
                return False
 
    return True
:9 8 8
 
:7 8 9
 
:4 5 6
 
;taxe2out.txt
 
:Datele de intrare nu corespund restrictiilor impus.
 
== Rezolvare ==
 
<syntaxhighlight lang="python3" line="1">


def suma_maxima_bani(matrice_taxe, suma_initiala):
def solve(s, n, a):
     n = len(matrice_taxe)
     # Inițializează o matrice pentru a stoca costurile minime de a ajunge la fiecare celulă
     dp = [[0] * n for _ in range(n)]
     b = [[float('inf')] * n for _ in range(n)]
    b[0][0] = a[0][0]  # Costul de a ajunge la celula de start este costul celulei de start


     # Inițializăm prima coloană și prima linie cu sumele acumulate
     # Utilizează BFS pentru a explora toate căile posibile
     dp[0][0] = suma_initiala - matrice_taxe[0][0]
     queue = [(0, 0)]
    for i in range(1, n):
    while queue:
        dp[i][0] = max(dp[i-1][0], suma_initiala - matrice_taxe[i][0])
        x, y = queue.pop(0)
        dp[0][i] = max(dp[0][i-1], suma_initiala - matrice_taxe[0][i])
        for dx, dy in [(0, 1), (1, 0), (-1, 0), (0, -1)]:  # Explorează în toate direcțiile
            nx, ny = x + dx, y + dy
            if 0 <= nx < n and 0 <= ny < n:
                new_cost = b[x][y] + a[nx][ny]
                if new_cost < b[nx][ny]:
                    b[nx][ny] = new_cost
                    queue.append((nx, ny))


     # Calculăm sumele maxime posibile pentru fiecare cameră
     return s - b[n-1][n-1] if b[n-1][n-1] <= s else -1
    for i in range(1, n):
        for j in range(1, n):
            dp[i][j] = max(dp[i-1][j], dp[i][j-1], suma_initiala - matrice_taxe[i][j])


     # Verificăm dacă investitorul poate primi aprobările necesare
def main():
     return dp[n-1][n-1] >= 0
     s, n, a = read_input()
     if not verify_restrictions(s, n, a):
        write_output("Datele nu corespund restrictiilor impuse")
    else:
        result = solve(s, n, a)
        write_output(result)


if suma_maxima_bani(matrice_taxe, suma_initiala):
if __name__ == "__main__":
    print(f"Investitorul poate primi aprobările necesare și îi rămâne în buzunar suma maximă de bani: {dp[n-1][n-1]}")
     main()
else:
     print("Investitorul nu poate primi aprobările necesare.")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 06:52, 23 February 2024

Enunt[edit | edit source]

Într-o ţară în care corupţia este în floare şi economia la pământ, pentru a obţine toate aprobările necesare în scopul demarării unei afaceri, investitorul trebuie să treacă prin mai multe camere ale unei clădiri în care se află birouri.

Clădirea are un singur nivel în care birourile sunt lipite unele de altele formând un caroiaj pătrat de dimensiune n•n. Pentru a facilita accesul în birouri, toate camerele vecine au uşi între ele. În fiecare birou se află un funcţionar care pretinde o taxă de trecere prin cameră (taxă ce poate fi, pentru unele camere, egală cu 0). Investitorul intră încrezător prin colţul din stânga-sus al clădirii (cum se vede de sus planul clădirii) şi doreşte să ajungă în colţul opus al clădirii, unde este ieşirea, plătind o taxă totală cât mai mică.

Cerința[edit | edit source]

Ştiind că el are în buzunar S euro şi că fiecare funcţionar îi ia taxa de cum intră în birou, se cere să se determine dacă el poate primi aprobările necesare şi, în caz afirmativ, care este suma maximă de bani care îi rămâne în buzunar la ieşirea din clădire.

Date de intrare[edit | edit source]

Fişierul de intrare taxe2IN.txt conţine pe prima linie cele două numere S şi n despărţite printr-un spaţiu, iar pe următoarele n linii câte n numere separate prin spaţii ce reprezintă taxele cerute de funcţionarii din fiecare birou.

Date de ieșire[edit | edit source]

Fişierul de ieşire taxe2OUT.txt conţine o singură linie pe care se află numărul maxim de euro care îi rămân în buzunar sau valoarea –1 dacă investitorului nu-i ajung banii pentru a obţine aprobarea. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări[edit | edit source]

  • 3 ≤ N ≤ 100
  • 1 ≤ S ≤ 10000
  • Valorile reprezentând taxele cerute de funcţionarii din birouri sunt numere naturale, o taxă nedepășind valoarea de 200 de euro.

Exemplul 1:[edit | edit source]

taxe2IN.txt

10 3
1 2 5
1 3 1
0 8 1

taxe2OUT.txt

3

Exemplul 2:[edit | edit source]

taxe2IN.txt

2 2
1 2 
1 3 

taxe2OUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> def read_input(filename="taxe2IN.txt"):

   with open(filename, "r") as file:
       s, n = map(int, file.readline().split())
       a = [list(map(int, file.readline().split())) for _ in range(n)]
   return s, n, a

def write_output(result, filename="taxe2OUT.txt"):

   with open(filename, "w") as file:
       file.write(str(result))

def verify_restrictions(s, n, a):

   if not (3 <= n <= 100):
       return False
   if not (1 <= s <= 10000):
       return False
   for row in a:
       for tax in row:
           if not (0 <= tax <= 200):
               return False
   return True

def solve(s, n, a):

   # Inițializează o matrice pentru a stoca costurile minime de a ajunge la fiecare celulă
   b = [[float('inf')] * n for _ in range(n)]
   b[0][0] = a[0][0]  # Costul de a ajunge la celula de start este costul celulei de start
   # Utilizează BFS pentru a explora toate căile posibile
   queue = [(0, 0)]
   while queue:
       x, y = queue.pop(0)
       for dx, dy in [(0, 1), (1, 0), (-1, 0), (0, -1)]:  # Explorează în toate direcțiile
           nx, ny = x + dx, y + dy
           if 0 <= nx < n and 0 <= ny < n:
               new_cost = b[x][y] + a[nx][ny]
               if new_cost < b[nx][ny]:
                   b[nx][ny] = new_cost
                   queue.append((nx, ny))
   return s - b[n-1][n-1] if b[n-1][n-1] <= s else -1

def main():

   s, n, a = read_input()
   if not verify_restrictions(s, n, a):
       write_output("Datele nu corespund restrictiilor impuse")
   else:
       result = solve(s, n, a)
       write_output(result)

if __name__ == "__main__":

   main()

</syntaxhighlight>