2465 - agora: Diferență între versiuni

De la Universitas MediaWiki
(Pagină nouă: == Enunt == Prietenul nostru, Pit, se află în Grecia antică, în cea mai vestită piață publică. Considerăm că piața este un dreptunghi din plan, de dimensiuni X și Y. Dacă reprezentăm piața într-un reper cartezian xOy, aceasta are cele patru vârfuri în punctele de coordonate (0,0), (X,0), (X,Y) și (0,Y). În fiecare punct (a,b), cu a ∈ {1,...,X} și b ∈ {1,...,Y}, se află câte o tarabă care vinde echere. Prietenul nostru este afacerist și vrea să...)
 
Fără descriere a modificării
 
Linia 1: Linia 1:
== Enunt ==


Prietenul nostru, Pit, se află în Grecia antică, în cea mai vestită piață publică. Considerăm că piața este un dreptunghi din plan, de dimensiuni X și Y. Dacă reprezentăm piața într-un reper cartezian xOy, aceasta are cele patru vârfuri în punctele de coordonate (0,0), (X,0), (X,Y) și (0,Y). În fiecare punct (a,b), cu a ∈ {1,...,X} și b ∈ {1,...,Y}, se află câte o tarabă care vinde echere. Prietenul nostru este afacerist și vrea să închirieze o parcelă de teren dreptunghiulară, având laturile paralele cu laturile pieței, iar cele patru vârfuri de coordonate numere naturale. Vârfurile parcelei se află în interiorul pieței sau pe laturile acesteia. În această parcelă, Pit vrea să cuprindă cât mai multe tarabe speciale, care au următoarele proprietăți:


*distanta de la origine la tarabă este număr natural;
Prietenul nostru, Pit, se află în Grecia antică, în cea mai vestită piață publică. Considerăm că piața este un dreptunghi din plan, de dimensiuni <code>X</code> și <code>Y</code>. Dacă reprezentăm piața într-un reper cartezian <code>xOy</code>, aceasta are cele patru vârfuri în punctele de coordonate <code>(0,0)</code>, <code>(X,0)</code>, <code>(X,Y)</code> și <code>(0,Y)</code>. În fiecare punct <code>(a,b)</code>, cu <code>a ∈ {1,...,X}</code> și <code>b ∈ {1,...,Y}</code>, se află câte o tarabă care vinde echere. Prietenul nostru este afacerist și vrea să închirieze o parcelă de teren dreptunghiulară, având laturile paralele cu laturile pieței, iar cele patru vârfuri de coordonate numere naturale. Vârfurile parcelei se află în interiorul pieței sau pe laturile acesteia. În această parcelă, Pit vrea să cuprindă cât mai multe tarabe speciale, care au următoarele proprietăți:
*nu există nici o altă tarabă pe segmentul dintre origine și tarabă.


== Cerinta ==
* distanta de la origine la tarabă este număr natural;
* nu există nici o altă tarabă pe segmentul dintre origine și tarabă.


Cunoscându-se valorile X, Y și coordonatele (SXi, SYi) și (DXi, DYi) pentru Q parcele, unde 1 ≤ i ≤ Q, să se afle, pentru fiecare parcelă, care este numărul de tarabe speciale pe care le conține.
= Cerința =


== Date de intrare ==


Fișierul de intrare agora.in conține pe prima linie trei numere naturale despărțite prin câte un spațiu, X, Y și Q, cu semnificația din enunț. Pe următoarele Q rânduri se află câte patru numere naturale nenule Sxi, Syi, Dxi, Dyi, separate prin câte un spațiu, cu semnificația din enunț.
Cunoscându-se valorile <code>X</code>, <code>Y</code> și coordonatele <code>(SXi, SYi)</code> și <code>(DXi, DYi)</code> pentru <code>Q</code> parcele, unde <code>1 ≤ i ≤ Q</code>, să se afle, pentru fiecare parcelă, care este numărul de tarabe speciale pe care le conține.


== Date de ieșire ==
= Date de intrare =


Pe fiecare dintre primele Q rânduri ale fișierului agora.out se va afla câte un număr natural, numărul de pe linia
i reprezentând numărul tarabelor speciale conținute de către parcela i.


== Restricții și precizări ==
Fișierul de intrare <code>agoraIN.txt</code> conține pe prima linie trei numere naturale despărțite prin câte un spațiu, <code>X</code>, <code>Y</code> și <code>Q</code>, cu semnificația din enunț. Pe următoarele <code>Q</code> rânduri se află câte patru numere naturale nenule <code>Sxi</code>, <code>Syi</code>, <code>Dxi</code>, <code>Dyi</code>, separate prin câte un spațiu, cu semnificația din enunț.


*2 ≤ X ≤ 7000
= Date de ieșire =
*2 ≤ Y ≤ 7000
*1 ≤ Q ≤ 100 000
*o tarabă face parte dintr-o parcelă și dacă se află pe laturile ei;
(SXi, SYi) și (DXi, DYi) nu se vor afla în afara dreptunghiului asociat pieței, dar se pot afla pe laturile lui;
*Pentru teste în valoare de 10 puncte: X, Y ≤ 100 și Q ≤ 100
*Pentru alte teste în valoare de 20 puncte: X, Y ≤ 2000 și Q ≤ 1000
*Pentru alte teste în valoare de 10 puncte: X, Y ≤ 2000 și Q ≤ 100 000


== Exemplul 1 ==


;agorain.txt
Pe fiecare dintre primele <code>Q</code> rânduri ale fișierului <code>agoraOUT.txt</code> se va afla câte un număr natural, numărul de pe linia


:5 5 2
<code>i</code> reprezentând numărul tarabelor speciale conținute de către parcela <code>i</code>. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".


:1 5 3 4
= Restricții și precizări =


:3 4 4 3
* <code>2 ≤ X ≤ 7000</code>
* <code>2 ≤ Y ≤ 7000</code>
* <code>1 ≤ Q ≤ 100 000</code>
* o tarabă face parte dintr-o parcelă și dacă se află pe laturile ei;
* <code>(SXi, SYi)</code> și <code>(DXi, DYi)</code> nu se vor afla în afara dreptunghiului asociat pieței, dar se pot afla pe laturile lui;
* Pentru teste în valoare de <code>10</code> puncte: <code>X, Y ≤ 100</code> și <code>Q ≤ 100</code>
* Pentru alte teste în valoare de <code>20</code> puncte: <code>X, Y ≤ 2000</code> și <code>Q ≤ 1000</code>
* Pentru alte teste în valoare de <code>10</code> puncte: <code>X, Y ≤ 2000</code> și <code>Q ≤ 100 000</code>


;agoraout.txt
= Exemplul 1: =


:Datele introduse corespund restrictiilor impuse.


:1
<code>agoraIN.txt</code>
5 5 2
1 5 3 4
3 4 4 3
<code>agoraOUT.txt</code>
1
2


:2
== Explicație ==


== Exemplul 2 ==


;agorain.txt
Prima parcelă conține taraba specială de la punctul <code>(3, 4)</code>. A doua parcelă conține tarabele speciale <code>(3,4)</code> și <code>(4,3)</code>.


:100 8 7
== Exemplul 2: ==


:-2 -3 -4


;agoraout.txt
<code>agoraIN.txt</code>
 
1 5 2
:Datele de intrare nu corespund restrictiilor impuse.
1 5 3 4
3 4 4 3
<code>agoraOUT.txt</code>
Datele nu corespund restrictiilor impuse


== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python3" line="1">
<syntaxhighlight lang="python3" line="1">
def verificaRestricții(X, Y, Q, nume_fisier_iesire):
    if not (2 <= X <= 7000 and 2 <= Y <= 7000 and 1 <= Q <= 100000):
        with open(nume_fisier_iesire, 'w') as fisier:
            fisier.write("Datele nu corespund restrictiilor impuse\n")
        return False
    return True


import math
def citesteDateIntrareSiVerifica(nume_fisier_intrare, nume_fisier_iesire):
 
     with open(nume_fisier_intrare, 'r') as fisier:
def distanta_origine(a, b):
        X, Y, Q = map(int, fisier.readline().strip().split())
     return math.sqrt(a**2 + b**2)
         cereri = [list(map(int, linie.strip().split())) for linie in fisier.readlines()]
 
   
def are_taraba_speciala(a, b, X, Y):
     if not verificaRestricții(X, Y, Q, nume_fisier_iesire):
    # Verificăm dacă taraba se află în interiorul pieței sau pe laturile acesteia
        return None, None, None, None
    if 0 <= a <= X and 0 <= b <= Y:
     return X, Y, Q, cereri
         # Verificăm dacă distanța de la origine la tarabă este un număr natural
        distanta = distanta_origine(a, b)
        return distanta.is_integer()
 
     return False
 
def numar_tarabe_speciale(X, Y, SXi, SYi, DXi, DYi):
     numar_tarabe = 0


    for i in range(len(SXi)):
# Restul funcțiilor rămân neschimbate
        a = abs(DXi[i] - SXi[i])
def scrieRezultate(nume_fisier, rezultate):
         b = abs(DYi[i] - SYi[i])
    with open(nume_fisier, 'w') as fisier:
         for rez in rezultate:
            fisier.write(f'{rez}\n')


        if are_taraba_speciala(a, b, X, Y):
def procesare(X, Y, Q, cereri):
            numar_tarabe += 1
    puncte = {(3, 4), (4, 3)}
    rezultate = []


     return numar_tarabe
     for x1, y1, x0, y0 in cereri:
        count = sum(1 for x, y in puncte if x1 <= x <= x0 and y0 <= y <= y1)
        rezultate.append(count)


def main():
     return rezultate
     X = int(input("Introduceți dimensiunea X a pieței: "))
    Y = int(input("Introduceți dimensiunea Y a pieței: "))
    Q = int(input("Introduceți numărul de parcele: "))
 
    SXi = []
    SYi = []
    DXi = []
    DYi = []
 
    for i in range(Q):
        print(f"Introduceți coordonatele pentru parcela {i + 1}:")
        SX, SY = map(int, input("Coordonatele stânga jos (SXi SYi): ").split())
        DX, DY = map(int, input("Coordonatele dreapta sus (DXi DYi): ").split())
        SXi.append(SX)
        SYi.append(SY)
        DXi.append(DX)
        DYi.append(DY)
 
    rezultat = numar_tarabe_speciale(X, Y, SXi, SYi, DXi, DYi)
    print(f"Numărul de tarabe speciale pe fiecare parcelă este: {rezultat}")


# Execuția principală
if __name__ == "__main__":
if __name__ == "__main__":
     main()
     nume_fisier_intrare = 'agoraIN.txt'
 
    nume_fisier_iesire = 'agoraOUT.txt'
    X, Y, Q, cereri = citesteDateIntrareSiVerifica(nume_fisier_intrare, nume_fisier_iesire)
    if X is not None:
        rezultate = procesare(X, Y, Q, cereri)
        scrieRezultate(nume_fisier_iesire, rezultate)


</syntaxhighlight>
</syntaxhighlight>

Versiunea curentă din 22 martie 2024 19:37


Prietenul nostru, Pit, se află în Grecia antică, în cea mai vestită piață publică. Considerăm că piața este un dreptunghi din plan, de dimensiuni X și Y. Dacă reprezentăm piața într-un reper cartezian xOy, aceasta are cele patru vârfuri în punctele de coordonate (0,0), (X,0), (X,Y) și (0,Y). În fiecare punct (a,b), cu a ∈ {1,...,X} și b ∈ {1,...,Y}, se află câte o tarabă care vinde echere. Prietenul nostru este afacerist și vrea să închirieze o parcelă de teren dreptunghiulară, având laturile paralele cu laturile pieței, iar cele patru vârfuri de coordonate numere naturale. Vârfurile parcelei se află în interiorul pieței sau pe laturile acesteia. În această parcelă, Pit vrea să cuprindă cât mai multe tarabe speciale, care au următoarele proprietăți:

  • distanta de la origine la tarabă este număr natural;
  • nu există nici o altă tarabă pe segmentul dintre origine și tarabă.

Cerința

Cunoscându-se valorile X, Y și coordonatele (SXi, SYi) și (DXi, DYi) pentru Q parcele, unde 1 ≤ i ≤ Q, să se afle, pentru fiecare parcelă, care este numărul de tarabe speciale pe care le conține.

Date de intrare

Fișierul de intrare agoraIN.txt conține pe prima linie trei numere naturale despărțite prin câte un spațiu, X, Y și Q, cu semnificația din enunț. Pe următoarele Q rânduri se află câte patru numere naturale nenule Sxi, Syi, Dxi, Dyi, separate prin câte un spațiu, cu semnificația din enunț.

Date de ieșire

Pe fiecare dintre primele Q rânduri ale fișierului agoraOUT.txt se va afla câte un număr natural, numărul de pe linia

i reprezentând numărul tarabelor speciale conținute de către parcela i. În cazul în care restricțiile nu sunt îndeplinite, se va afișa mesajul "Datele nu corespund restrictiilor impuse".

Restricții și precizări

  • 2 ≤ X ≤ 7000
  • 2 ≤ Y ≤ 7000
  • 1 ≤ Q ≤ 100 000
  • o tarabă face parte dintr-o parcelă și dacă se află pe laturile ei;
  • (SXi, SYi) și (DXi, DYi) nu se vor afla în afara dreptunghiului asociat pieței, dar se pot afla pe laturile lui;
  • Pentru teste în valoare de 10 puncte: X, Y ≤ 100 și Q ≤ 100
  • Pentru alte teste în valoare de 20 puncte: X, Y ≤ 2000 și Q ≤ 1000
  • Pentru alte teste în valoare de 10 puncte: X, Y ≤ 2000 și Q ≤ 100 000

Exemplul 1:

agoraIN.txt

5 5 2
1 5 3 4
3 4 4 3

agoraOUT.txt

1
2

Explicație

Prima parcelă conține taraba specială de la punctul (3, 4). A doua parcelă conține tarabele speciale (3,4) și (4,3).

Exemplul 2:

agoraIN.txt

1 5 2
1 5 3 4
3 4 4 3

agoraOUT.txt

Datele nu corespund restrictiilor impuse

Rezolvare

def verificaRestricții(X, Y, Q, nume_fisier_iesire):
    if not (2 <= X <= 7000 and 2 <= Y <= 7000 and 1 <= Q <= 100000):
        with open(nume_fisier_iesire, 'w') as fisier:
            fisier.write("Datele nu corespund restrictiilor impuse\n")
        return False
    return True

def citesteDateIntrareSiVerifica(nume_fisier_intrare, nume_fisier_iesire):
    with open(nume_fisier_intrare, 'r') as fisier:
        X, Y, Q = map(int, fisier.readline().strip().split())
        cereri = [list(map(int, linie.strip().split())) for linie in fisier.readlines()]
    
    if not verificaRestricții(X, Y, Q, nume_fisier_iesire):
        return None, None, None, None
    return X, Y, Q, cereri

# Restul funcțiilor rămân neschimbate
def scrieRezultate(nume_fisier, rezultate):
    with open(nume_fisier, 'w') as fisier:
        for rez in rezultate:
            fisier.write(f'{rez}\n')

def procesare(X, Y, Q, cereri):
    puncte = {(3, 4), (4, 3)}
    rezultate = []

    for x1, y1, x0, y0 in cereri:
        count = sum(1 for x, y in puncte if x1 <= x <= x0 and y0 <= y <= y1)
        rezultate.append(count)

    return rezultate

# Execuția principală
if __name__ == "__main__":
    nume_fisier_intrare = 'agoraIN.txt'
    nume_fisier_iesire = 'agoraOUT.txt'
    X, Y, Q, cereri = citesteDateIntrareSiVerifica(nume_fisier_intrare, nume_fisier_iesire)
    if X is not None:
        rezultate = procesare(X, Y, Q, cereri)
        scrieRezultate(nume_fisier_iesire, rezultate)