Jump to content
Main menu
Main menu
move to sidebar
hide
Navigation
Main page
Recent changes
Random page
Help about MediaWiki
Bitnami MediaWiki
Search
Search
Create account
Log in
Personal tools
Create account
Log in
Pages for logged out editors
learn more
Contributions
Talk
Editing
1856 - Taxe
Page
Discussion
English
Read
Edit
Edit source
View history
Tools
Tools
move to sidebar
hide
Actions
Read
Edit
Edit source
View history
General
What links here
Related changes
Special pages
Page information
Warning:
You are not logged in. Your IP address will be publicly visible if you make any edits. If you
log in
or
create an account
, your edits will be attributed to your username, along with other benefits.
Anti-spam check. Do
not
fill this in!
== 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 <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ă. = 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. = 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 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". = Restricții și precizări = * <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. = Exemplul 1: = <code>taxe2IN.txt</code> 10 3 1 2 5 1 3 1 0 8 1 <code>taxe2OUT.txt</code> 3 == Exemplul 2: == <code>taxe2IN.txt</code> 2 2 1 2 1 3 <code>taxe2OUT.txt</code> Datele nu corespund restrictiilor impuse : : == Rezolvare == <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>
Summary:
Please note that all contributions to Bitnami MediaWiki may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see
Bitnami MediaWiki:Copyrights
for details).
Do not submit copyrighted work without permission!
Cancel
Editing help
(opens in new window)
Toggle limited content width