3513 - Covoare1: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerinta == Se consideră o încăpere de lungime n și lățime m împărțită în n*m zone pătrate, sub forma unei matrici cu n linii și m coloane. Încăperea este acoperită în totalitate cu p covoare dreptunghice de diferite dimensiuni astfel încât acestea nu se suprapun, fiecare zonă pătrată a încăperii fiind acoperită de exact un covor. Miguel, administratorul clădirii, este responsabil cu spălarea covoarelor. Astfel, el a notat dimensiunile fiecărui...
 
 
(2 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Cerinta ==
== Cerinta ==


Se consideră o încăpere de lungime n și lățime m împărțită în n*m zone pătrate, sub forma unei matrici cu n linii și m coloane. Încăperea este acoperită în totalitate cu p covoare dreptunghice de diferite dimensiuni astfel încât acestea nu se suprapun, fiecare zonă pătrată a încăperii fiind acoperită de exact un covor.
Se consideră o încăpere de lungime '''n''' și lățime '''m''' împărțită în '''n*m''' zone pătrate, sub forma unei matrici cu n linii și m coloane. Încăperea este acoperită în totalitate cu p covoare dreptunghice de diferite dimensiuni astfel încât acestea nu se suprapun, fiecare zonă pătrată a încăperii fiind acoperită de exact un covor.


Miguel, administratorul clădirii, este responsabil cu spălarea covoarelor. Astfel, el a notat dimensiunile fiecărui covor, în ordine, de sus în jos și de la stânga la dreapta. Covoarele au fost scoase și spălate, iar acum Miguel vrea să le pună la loc.
Miguel, administratorul clădirii, este responsabil cu spălarea covoarelor. Astfel, el a notat dimensiunile fiecărui covor, în ordine, de sus în jos și de la stânga la dreapta. Covoarele au fost scoase și spălate, iar acum Miguel vrea să le pună la loc.
Line 8: Line 8:
== Date de intrare ==
== Date de intrare ==


Fișierul de intrare covoare1.txt conține pe prima linie numerele n, m, p, iar pe următoarele p linii câte două numere a și b reprezentând lungimea (numărul de linii) și lățimea (numărul de coloane) fiecărui covor în ordinea notată de Miguel.
Fișierul de intrare '''covoare1in.txt''' conține pe prima linie numerele '''n, m, p''', iar pe următoarele '''p''' linii câte două numere a și b reprezentând lungimea (numărul de linii) și lățimea (numărul de coloane) fiecărui covor în ordinea notată de Miguel.


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


Fișierul de ieșire covoare1.txt va conține p linii cu câte două numere ce reprezintă coordonatele colțului din stânga sus ale fiecărui covor, în ordinea notată de Miguel.
Fișierul de ieșire '''covoare1out.txt''' va conține '''p''' linii cu câte două numere ce reprezintă coordonatele colțului din stânga sus ale fiecărui covor, în ordinea notată de Miguel.


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


*1 n, m  1.000.000
*1 ⩽ n, m  ⩽ 1.000.000
*p 200.000
*p ⩽ 200.000


== Exemplul 1 ==
== Exemplul 1 ==
;Intrare
;covoare1in.txt
:7 8 9
:7 8 9
:4 2
:4 2
Line 32: Line 32:
:1 3
:1 3


;Iesire
;covoare1out.txt
;Datele introduse corespund restrictiilor impuse
:Datele introduse corespund restrictiilor impuse
:1 1
:1 1
:1 3
:1 3
Line 45: Line 45:


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




== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
import heapq
def rezolva(n, m, p, covoare):
def rezolva(n, m, p, covoare):
     # Funcție pentru a verifica dacă o anumită poziție este disponibilă pentru așezarea unui covor
     # Initializare heap cu covoare
     def este_disponibil(x, y, a, b):
     heapq.heapify(covoare)
        for i in range(x, x + a):
            for j in range(y, y + b):
                if room[i][j] == 1:
                    return False
        return True


     # Funcție pentru a așeza un covor în încăpere
     # Afișare coordonate în ordinea notată de Miguel
     def aseaza_covor(x, y, a, b):
     rezultat = []
        for i in range(x, x + a):
    for _ in range(p):
            for j in range(y, y + b):
        top_covoare = heapq.heappop(covoare)
                room[i][j] = 1
        rezultat.append((top_covoare[0], top_covoare[1]))


     # Funcție pentru a găsi o poziție disponibilă în încăpere pentru așezarea unui covor
     return rezultat
    def gaseste_pozitie_disponibila():
        for i in range(n):
            for j in range(m):
                if room[i][j] == 0:
                    return i, j
 
    # Inițializează o matrice pentru încăpere
    room = [[0] * m for _ in range(n)]
 
    # Inițializează o listă pentru a stoca coordonatele colțului din stânga sus ale fiecărui covor
    rezultat = []


     # Parcurge fiecare covor
def verifica_rezultat(input_file, output_file):
     for covor in covoare:
     # Citire date de intrare
         a, b = covor
     with open(input_file, "r") as f:
         n, m, p = map(int, f.readline().split())
        covoare = [tuple(map(int, f.readline().split())) for _ in range(p)]


        # Găsește o poziție disponibilă pentru așezarea covorului
    # Apelare funcție de rezolvare
        pozitie = gaseste_pozitie_disponibila()
    rezultat_obtinut = rezolva(n, m, p, covoare)


        # Verifică dacă poziția găsită este validă pentru așezarea covorului
    # Citire rezultat așteptat
        if este_disponibil(pozitie[0], pozitie[1], a, b):
    with open(output_file, "r") as g:
            # Adaugă coordonatele colțului din stânga sus ale covorului la rezultat
        rezultat_asteptat = [tuple(map(int, linie.split())) for linie in g.readlines()]
            rezultat.append(pozitie)
            # Așează covorul în încăpere
            aseaza_covor(pozitie[0], pozitie[1], a, b)
        else:
            # Dacă nu se găsește o poziție validă, adaugă (-1, -1) la rezultat
            rezultat.append((-1, -1))


     return rezultat
     # Verificare rezultat
    if rezultat_obtinut == rezultat_asteptat:
        print("Rezultat corect!")
    else:
        print("Rezultat incorect!")
        print("Rezultat așteptat:")
        print(rezultat_asteptat)
        print("Rezultat obținut:")
        print(rezultat_obtinut)


def main():
# Citire date de intrare
    # Deschide fișierul de intrare
with open("covoare1in.txt", "r") as f:
    with open("covoare1.txt", "r") as f_in:
    n, m, p = map(int, f.readline().split())
        n, m, p = map(int, f_in.readline().split())
    covoare = [tuple(map(int, f.readline().split())) for _ in range(p)]
        covoare = [tuple(map(int, f_in.readline().split())) for _ in range(p)]


    # Rezolvă problema
# Apelare funcție de rezolvare
    rezultat = rezolva(n, m, p, covoare)
rezultat = rezolva(n, m, p, covoare)


    # Deschide fișierul de ieșire
# Scriere date de ieșire
    with open("covoare1.txt", "w") as f_out:
with open("covoare1out.txt", "w") as g:
        # Scrie rezultatul în fișierul de ieșire
    for coord in rezultat:
        for r in rezultat:
        g.write(f"{coord[0]} {coord[1]}\n")
            f_out.write(f"{r[0]} {r[1]}\n")


if __name__ == "__main__":
# Apelare funcție de verificare
    main()
verifica_rezultat("covoare1in.txt", "covoare1out.txt")


</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 12:10, 29 December 2023

Cerinta[edit | edit source]

Se consideră o încăpere de lungime n și lățime m împărțită în n*m zone pătrate, sub forma unei matrici cu n linii și m coloane. Încăperea este acoperită în totalitate cu p covoare dreptunghice de diferite dimensiuni astfel încât acestea nu se suprapun, fiecare zonă pătrată a încăperii fiind acoperită de exact un covor.

Miguel, administratorul clădirii, este responsabil cu spălarea covoarelor. Astfel, el a notat dimensiunile fiecărui covor, în ordine, de sus în jos și de la stânga la dreapta. Covoarele au fost scoase și spălate, iar acum Miguel vrea să le pună la loc. Cunoscând dimensiunile încăperii, numărul de covoare precum și dimensiunile fiecărui covor în ordinea in care Miguel le-a notat, să se afișeze coordonatele colțului din stânga sus ale fiecărui covor, în ordinea notată de Miguel, adică in ordine lexicografică.

Date de intrare[edit | edit source]

Fișierul de intrare covoare1in.txt conține pe prima linie numerele n, m, p, iar pe următoarele p linii câte două numere a și b reprezentând lungimea (numărul de linii) și lățimea (numărul de coloane) fiecărui covor în ordinea notată de Miguel.

Date de iesire[edit | edit source]

Fișierul de ieșire covoare1out.txt va conține p linii cu câte două numere ce reprezintă coordonatele colțului din stânga sus ale fiecărui covor, în ordinea notată de Miguel.

Restrictii si precizari[edit | edit source]

  • 1 ⩽ n, m ⩽ 1.000.000
  • p ⩽ 200.000

Exemplul 1[edit | edit source]

covoare1in.txt
7 8 9
4 2
2 4
5 2
1 4
3 3
2 1
3 2
2 3
1 3
covoare1out.txt
Datele introduse corespund restrictiilor impuse
1 1
1 3
1 7
3 3
4 3
4 6
5 1
6 6
7 3

Exemplul 2[edit | edit source]

covoare1in.txt
-3 -2 2
6 2
0 -10
Datele introduse nu corespund restrictiilor impuse


Rezolvare[edit | edit source]

<syntaxhighlight lang="python3" line="1"> import heapq

def rezolva(n, m, p, covoare):

   # Initializare heap cu covoare
   heapq.heapify(covoare)
   # Afișare coordonate în ordinea notată de Miguel
   rezultat = []
   for _ in range(p):
       top_covoare = heapq.heappop(covoare)
       rezultat.append((top_covoare[0], top_covoare[1]))
   return rezultat

def verifica_rezultat(input_file, output_file):

   # Citire date de intrare
   with open(input_file, "r") as f:
       n, m, p = map(int, f.readline().split())
       covoare = [tuple(map(int, f.readline().split())) for _ in range(p)]
   # Apelare funcție de rezolvare
   rezultat_obtinut = rezolva(n, m, p, covoare)
   # Citire rezultat așteptat
   with open(output_file, "r") as g:
       rezultat_asteptat = [tuple(map(int, linie.split())) for linie in g.readlines()]
   # Verificare rezultat
   if rezultat_obtinut == rezultat_asteptat:
       print("Rezultat corect!")
   else:
       print("Rezultat incorect!")
       print("Rezultat așteptat:")
       print(rezultat_asteptat)
       print("Rezultat obținut:")
       print(rezultat_obtinut)
  1. Citire date de intrare

with open("covoare1in.txt", "r") as f:

   n, m, p = map(int, f.readline().split())
   covoare = [tuple(map(int, f.readline().split())) for _ in range(p)]
  1. Apelare funcție de rezolvare

rezultat = rezolva(n, m, p, covoare)

  1. Scriere date de ieșire

with open("covoare1out.txt", "w") as g:

   for coord in rezultat:
       g.write(f"{coord[0]} {coord[1]}\n")
  1. Apelare funcție de verificare

verifica_rezultat("covoare1in.txt", "covoare1out.txt")

</syntaxhighlight>