3738 - New York: Difference between revisions

From Bitnami MediaWiki
Pagină nouă: == Cerința == Doru s-a mutat în New York și își caută o nouă locuință specială în perimetrul străzilor numerotate cu numerele distincte de la 1 la n. Fiind pasionat de matematică, el vrea să se mute pe strada în care cel mai mare divizor comun (cmmdc) al înălțimilor clădirilor este maxim. În plus, alegerea clădirii nu este una ușoară, el dorind să se mute doar într-o clădire perfectă. Numim o clădire perfectă o clădire care are cea mai mare în...
 
No edit summary
 
Line 1: Line 1:
== Cerința ==
== Cerința ==
Doru s-a mutat în New York și își caută o nouă locuință specială în perimetrul străzilor numerotate cu numerele distincte de la 1 la n. Fiind pasionat de matematică, el vrea să se mute pe strada în care cel mai mare divizor comun (cmmdc) al înălțimilor clădirilor este maxim.
Doru s-a mutat în New York și își caută o nouă locuință specială în perimetrul străzilor numerotate cu numerele distincte de la '''1''' la '''n'''. Fiind pasionat de matematică, el vrea să se mute pe strada în care cel mai mare divizor comun (cmmdc) al înălțimilor clădirilor este maxim.


În plus, alegerea clădirii nu este una ușoară, el dorind să se mute doar într-o clădire perfectă. Numim o clădire perfectă o clădire care are cea mai mare înălțime număr prim de pe strada pe care se află.
În plus, alegerea clădirii nu este una ușoară, el dorind să se mute doar într-o clădire perfectă. Numim o clădire perfectă o clădire care are cea mai mare înălțime număr prim de pe strada pe care se află.
Line 6: Line 6:
Fiind ocupat cu împachetatul, Doru vă roagă pe voi să găsiți clădirea perfectă.
Fiind ocupat cu împachetatul, Doru vă roagă pe voi să găsiți clădirea perfectă.
== Date de intrare ==
== Date de intrare ==
Fișierul de intrare nykin.txt conține pe prima linie numărul de străzi n pe care Doru își caută noua locuință.
Fișierul de intrare '''nykin.txt''' conține pe prima linie numărul de străzi '''n''' pe care Doru își caută noua locuință.
Pe fiecare dintre următoarele n linii (câte una pentru fiecare stradă din cele n, în ordinea crescătoare a numerelor străzilor) se află numărul m, reprezentând numărul de clădiri de pe strada curentă, urmat de m numere ce reprezintă înălțimile clădirilor de pe strada curentă (în ordinea poziționării lor pe stradă, de la stânga la dreapta). Pe fiecare linie numerele sunt separate prin câte un spațiu.
Pe fiecare dintre următoarele '''n''' linii (câte una pentru fiecare stradă din cele '''n''', în ordinea crescătoare a numerelor străzilor) se află numărul '''m''', reprezentând numărul de clădiri de pe strada curentă, urmat de '''m''' numere ce reprezintă înălțimile clădirilor de pe strada curentă (în ordinea poziționării lor pe stradă, de la stânga la dreapta). Pe fiecare linie numerele sunt separate prin câte un spațiu.
== Date de ieșire ==
== Date de ieșire ==
Fișierul de ieșire nykout.txt va conține două linii.
Fișierul de ieșire '''nykout.txt''' va conține două linii.


Prima linie va conține două numere naturale separate printr-un spațiu, reprezentând numărul străzii cerute și poziția pe stradă a clădirii în care se va muta Doru.
Prima linie va conține două numere naturale separate printr-un spațiu, reprezentând numărul străzii cerute și poziția pe stradă a clădirii în care se va muta Doru.
Line 15: Line 15:
A doua linie va conține un număr natural reprezentând înălțimea clădirii alese.
A doua linie va conține un număr natural reprezentând înălțimea clădirii alese.


Dacă pe strada cu cmmdc-ul maxim nu se găsește nicio clădire cu înălțimea un număr prim, atunci prima linie a fișierului va conține mesajul Nu am gasit casa!
Dacă pe strada cu cmmdc-ul maxim nu se găsește nicio clădire cu înălțimea un număr prim, atunci prima linie a fișierului va conține mesajul '''Nu am gasit casa!'''
== Restricții și precizări ==
== Restricții și precizări ==
*1 ⩽ n ⩽ 1000
*'''1 ⩽ n ⩽ 1000'''
*1 ⩽ m ⩽ 1000
*'''1 ⩽ m ⩽ 1000'''
*Numerele de pe a doua linie a fișierului de intrare sunt mai mici decât 1 000 000 000
*Numerele de pe a doua linie a fișierului de intrare sunt mai mici decât '''1 000 000 000'''
*Înălțimile clădirilor sunt numere naturale nenule mai mici ca 2 000 000 000.
*Înălțimile clădirilor sunt numere naturale nenule mai mici ca '''2 000 000 000'''.
*Pe fiecare stradă există cel puțin o clădire.
*Pe fiecare stradă există cel puțin o clădire.
*Dacă pe strada cu cmmdc-ul maxim sunt mai multe clădiri perfecte, se va afișa cea mai din dreapta.
*Dacă pe strada cu cmmdc-ul maxim sunt mai multe clădiri perfecte, se va afișa cea mai din dreapta.
*Dacă sunt mai multe străzi cu aceeași clădire perfectă, se va afișa cea care are numărul străzii cel mai mare.
*Dacă sunt mai multe străzi cu aceeași clădire perfectă, se va afișa cea care are numărul străzii cel mai mare.
== Exemplu 1 ==
== Exemplu 1 ==
;nykin.txt
;'''nykin.txt'''
:5
:5
:2 1 2
:2 1 2
Line 32: Line 32:
:4 3 6 9 12
:4 3 6 9 12
:4 34 17 68 17
:4 34 17 68 17
;nykout.txt
;'''nykout.txt'''
:5 4
:5 4
:17
:17
<br>
<br>
== Explicatie ==
== Explicatie ==
Valoarea maximă a celui mai mare divizor comun al înălțimilor clădirilor de pe o stradă dintre cele cinci este 17 (cmmdc(1,2)=1, cmmdc(18, 6, 48)=6, cmmdc(5, 7)=1, cmmdc(3, 6, 9, 12)=3, cmmdc(34, 17, 68, 17)=17). Astfel Doru va alege clădirea a 4-a de pe strada cu numărul 5.
Valoarea maximă a celui mai mare divizor comun al înălțimilor clădirilor de pe o stradă dintre cele cinci este '''17''' ('''cmmdc(1,2)=1, cmmdc(18, 6, 48)=6, cmmdc(5, 7)=1, cmmdc(3, 6, 9, 12)=3, cmmdc(34, 17, 68, 17)=17'''). Astfel Doru va alege clădirea a '''4'''-a de pe strada cu numărul '''5'''.
== Exemplu 2 ==
== Exemplu 2 ==
;nykin.txt
;'''nykin.txt'''
:0
:0
:-1 -3
:-1 -3
;nykut.txt
;'''nykut.txt'''
:Nu au fost respectate cerintele impuse
:Nu am gasit casa!
<br>
<br>
== Rezolvare ==
== Rezolvare ==
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#3738 - New York
#3738 - New York
def check_restrictions(n, m_values):
def cmmdc_lista(lista):
     if not (1 <= n <= 1000):
     def cmmdc(a, b):
         return False
        while b:
            a, b = b, a % b
        return a
 
    result = lista[0]
    for elem in lista[1:]:
         result = cmmdc(result, elem)


     for m, *heights in m_values:
     return result
        if not (1 <= m <= 1000):
            return False


        if not all(0 < height < 2000000000 for height in heights):
def este_prim(numar):
    if numar < 2:
        return False
    for i in range(2, int(numar**0.5) + 1):
        if numar % i == 0:
             return False
             return False
     return True
     return True


def find_perfect_building(n, m_values):
def gaseste_cladire_perfecta(strazi):
     if not check_restrictions(n, m_values):
     cmmdc_maxim = 0
        print("Date de intrare invalide!")
    strada_aleasa = 0
        return None
    cladire_aleasa = 0


     max_gcd = 0
     for i, strada in enumerate(strazi, start=1):
    selected_street = 0
        inaltimi = strada[1:]
    selected_position = 0
        cmmdc_strada = cmmdc_lista(inaltimi)


    for street, *heights in m_values:
        if cmmdc_strada > cmmdc_maxim:
        current_gcd = heights[0]
            cmmdc_maxim = cmmdc_strada
        for height in heights[1:]:
             strada_aleasa = i
             current_gcd = gcd(current_gcd, height)


        if current_gcd > max_gcd:
             for j, inaltime in enumerate(reversed(inaltimi), start=1):
             max_gcd = current_gcd
                if este_prim(inaltime):
            selected_street = street
                    cladire_aleasa = len(inaltimi) - j + 1
            selected_position = len(heights)
                    break


        elif current_gcd == max_gcd and street >= selected_street:
    return strada_aleasa, cladire_aleasa
            selected_street = street
            selected_position = len(heights)


    if max_gcd == 1:
        print("Nu am gasit casa!")
        return None
    return selected_street, selected_position, max_gcd
def gcd(a, b):
    while b:
        a, b = b, a % b
    return a
# Citire date de intrare
try:
try:
     with open("nykin.txt", "r") as file:
    # Citirea datelor de intrare
         n = int(file.readline())
     with open('nykin.txt', 'r') as f:
         m_values = [list(map(int, line.split())) for line in file.readlines()]
         n = int(f.readline().strip())
except FileNotFoundError:
         strazi = [list(map(int, f.readline().split())) for _ in range(n)]
    print("Fisierul de intrare nu exista!")
    exit()
 
# Calcul și scriere rezultat în fișierul de ieșire
result = find_perfect_building(n, m_values)
if result is not None:
    with open("nykout.txt", "w") as file:
        file.write(f"{result[0]} {result[1]}\n{result[2]}\n")


    # Calculul și scrierea rezultatului în fișierul de ieșire
    rezultat = gaseste_cladire_perfecta(strazi)
    with open('nykout.txt', 'w') as g:
        if rezultat[0] == 0:
            g.write("Nu am gasit casa!")
        else:
            g.write(f"{rezultat[0]} {rezultat[1]}\n{strazi[rezultat[0] - 1][rezultat[1]]}")
except Exception as e:
    print("A aparut o eroare:", str(e))
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 13:46, 5 January 2024

Cerința[edit | edit source]

Doru s-a mutat în New York și își caută o nouă locuință specială în perimetrul străzilor numerotate cu numerele distincte de la 1 la n. Fiind pasionat de matematică, el vrea să se mute pe strada în care cel mai mare divizor comun (cmmdc) al înălțimilor clădirilor este maxim.

În plus, alegerea clădirii nu este una ușoară, el dorind să se mute doar într-o clădire perfectă. Numim o clădire perfectă o clădire care are cea mai mare înălțime număr prim de pe strada pe care se află.

Fiind ocupat cu împachetatul, Doru vă roagă pe voi să găsiți clădirea perfectă.

Date de intrare[edit | edit source]

Fișierul de intrare nykin.txt conține pe prima linie numărul de străzi n pe care Doru își caută noua locuință. Pe fiecare dintre următoarele n linii (câte una pentru fiecare stradă din cele n, în ordinea crescătoare a numerelor străzilor) se află numărul m, reprezentând numărul de clădiri de pe strada curentă, urmat de m numere ce reprezintă înălțimile clădirilor de pe strada curentă (în ordinea poziționării lor pe stradă, de la stânga la dreapta). Pe fiecare linie numerele sunt separate prin câte un spațiu.

Date de ieșire[edit | edit source]

Fișierul de ieșire nykout.txt va conține două linii.

Prima linie va conține două numere naturale separate printr-un spațiu, reprezentând numărul străzii cerute și poziția pe stradă a clădirii în care se va muta Doru.

A doua linie va conține un număr natural reprezentând înălțimea clădirii alese.

Dacă pe strada cu cmmdc-ul maxim nu se găsește nicio clădire cu înălțimea un număr prim, atunci prima linie a fișierului va conține mesajul Nu am gasit casa!

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

  • 1 ⩽ n ⩽ 1000
  • 1 ⩽ m ⩽ 1000
  • Numerele de pe a doua linie a fișierului de intrare sunt mai mici decât 1 000 000 000
  • Înălțimile clădirilor sunt numere naturale nenule mai mici ca 2 000 000 000.
  • Pe fiecare stradă există cel puțin o clădire.
  • Dacă pe strada cu cmmdc-ul maxim sunt mai multe clădiri perfecte, se va afișa cea mai din dreapta.
  • Dacă sunt mai multe străzi cu aceeași clădire perfectă, se va afișa cea care are numărul străzii cel mai mare.

Exemplu 1[edit | edit source]

nykin.txt
5
2 1 2
3 18 6 48
2 5 7
4 3 6 9 12
4 34 17 68 17
nykout.txt
5 4
17


Explicatie[edit | edit source]

Valoarea maximă a celui mai mare divizor comun al înălțimilor clădirilor de pe o stradă dintre cele cinci este 17 (cmmdc(1,2)=1, cmmdc(18, 6, 48)=6, cmmdc(5, 7)=1, cmmdc(3, 6, 9, 12)=3, cmmdc(34, 17, 68, 17)=17). Astfel Doru va alege clădirea a 4-a de pe strada cu numărul 5.

Exemplu 2[edit | edit source]

nykin.txt
0
-1 -3
nykut.txt
Nu am gasit casa!


Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line>

  1. 3738 - New York

def cmmdc_lista(lista):

   def cmmdc(a, b):
       while b:
           a, b = b, a % b
       return a
   result = lista[0]
   for elem in lista[1:]:
       result = cmmdc(result, elem)
   return result

def este_prim(numar):

   if numar < 2:
       return False
   for i in range(2, int(numar**0.5) + 1):
       if numar % i == 0:
           return False
   return True

def gaseste_cladire_perfecta(strazi):

   cmmdc_maxim = 0
   strada_aleasa = 0
   cladire_aleasa = 0
   for i, strada in enumerate(strazi, start=1):
       inaltimi = strada[1:]
       cmmdc_strada = cmmdc_lista(inaltimi)
       if cmmdc_strada > cmmdc_maxim:
           cmmdc_maxim = cmmdc_strada
           strada_aleasa = i
           for j, inaltime in enumerate(reversed(inaltimi), start=1):
               if este_prim(inaltime):
                   cladire_aleasa = len(inaltimi) - j + 1
                   break
   return strada_aleasa, cladire_aleasa

try:

   # Citirea datelor de intrare
   with open('nykin.txt', 'r') as f:
       n = int(f.readline().strip())
       strazi = [list(map(int, f.readline().split())) for _ in range(n)]
   # Calculul și scrierea rezultatului în fișierul de ieșire
   rezultat = gaseste_cladire_perfecta(strazi)
   with open('nykout.txt', 'w') as g:
       if rezultat[0] == 0:
           g.write("Nu am gasit casa!")
       else:
           g.write(f"{rezultat[0]} {rezultat[1]}\n{strazi[rezultat[0] - 1][rezultat[1]]}")

except Exception as e:

   print("A aparut o eroare:", str(e))

</syntaxhighlight>