1701 - Birouri: Difference between revisions

From Bitnami MediaWiki
Raul (talk | contribs)
Pagină nouă: Arhi şi-a propus să extindă clădirea de birouri pe care a proiectat-o iniţial pe un singur nivel numerotat cu <code>1</code>, împărţit în <code>n*n</code> zone pătratice de latură <code>1</code>, fiecare corespunzând unui birou, prin construirea mai multor niveluri. În colţurile tuturor birourilor se construiesc grinzi de rezistenţă. Pentru a asigura rezistenţa întregii clădiri, Arhi va proiecta niveluri noi, numerotate cu <code>2</code>, <code>3</code>,…...
 
Raul (talk | contribs)
No edit summary
Line 48: Line 48:


=== Lipește codul aici ===
=== Lipește codul aici ===
​n, m, k, c, niv, b, p = 0, 0, 0, 0, 0, 0, 0
<syntaxhighlight lang="python" line="1">
 
​n, m, k, c, niv, b, p = 0, 0, 0, 0, 0, 0, 0
fin = open('birouri.in', 'r')
fin = open('birouri.in', 'r')
 
fout = open('birouri.out', 'w')
fout = open('birouri.out', 'w')
c, n = map(int, fin.readline().split())
 
m = n
c, n = map(int, fin.readline().split())
while n != 0 and n % 2 == 0:
 
    niv += 1
m = n
    if niv % 2 == 1:
 
        b += n * m
while n != 0 and n % 2 == 0:
    else:
 
        if n > m:
    niv += 1
            k = m
 
        else:
    if niv % 2 == 1:
            k = n
 
        p = k * k // 2 - k
        b += n * m
        b += p
 
        if p == 0:
    else:
            niv -= 1
 
        if k % 4 == 0:
        if n > m:
            k = k // 2
 
            n = k
            k = m
            m = k
 
        else:
        else:
            n = n // 2 - 1
 
            m = n + 2
            k = n
if c == 1:
 
    print(niv, file=fout)
        p = k * k // 2 - k
else:
 
    print(b, file=fout)
        b += p
fin.close()
 
fout.close()
        if p == 0:
</syntaxhighlight>
 
            niv -= 1
 
        if k % 4 == 0:
 
            k = k // 2
 
            n = k
 
            m = k
 
        else:
 
            n = n // 2 - 1
 
            m = n + 2
 
if c == 1:
 
    print(niv, file=fout)
 
else:
 
    print(b, file=fout)
 
fin.close()
 
fout.close()

Revision as of 13:50, 14 December 2023

Arhi şi-a propus să extindă clădirea de birouri pe care a proiectat-o iniţial pe un singur nivel numerotat cu 1, împărţit în n*n zone pătratice de latură 1, fiecare corespunzând unui birou, prin construirea mai multor niveluri. În colţurile tuturor birourilor se construiesc grinzi de rezistenţă. Pentru a asigura rezistenţa întregii clădiri, Arhi va proiecta niveluri noi, numerotate cu 2, 3,… atât timp cât conțin cel puțin un birou și sunt respectate următoarele patru reguli:

  • R1: fiecare nivel nou va fi proiectat sub forma unui dreptunghi sau pătrat de arie maximă pentru nivelele cu număr impar, respectiv, sub forma unui pătrat de arie maximă pentru nivelele cu număr par;
  • R2: fiecare dintre colţurile zidurilor unui nivel nou trebuie plasat pe câte o grindă de rezistenţă dintre două sau mai multe birouri de pe nivelul precedent;
  • R3: oricare două dintre colţurile zidurilor unui nivel nou vor fi plasate pe ziduri diferite (un zid nu se poate suprapune în totalitate pe alt zid) şi cel puţin două vârfuri opuse ale unui nivel nou se vor afla pe ziduri opuse ale nivelului precedent;
  • R4: orice porţiune de zid de pe nivelul k (k>1), construită deasupra unui birou de pe nivelul k-1, se va suprapune exact peste una dintre laturile biroului, sau îl va străbate în diagonală.

Birourile de pe nivelul k (k>1), vor fi construite exact deasupra celor de pe nivelul precedent, astfel, nivelurile 2, 4 etc. vor avea lângă ziduri spaţii triunghiulare care nu vor aparţine niciunui birou.

Numerele inscripţionate pe birouri în imaginea de mai sus, indică nivelul corespunzător birourilor vizibile de deasupra clădirii.

Cerința

Cunoscându-se lungimea n a laturii primului nivel al clădirii, să se determine:

  1. numărul maxim de niveluri pe care le poate avea clădirea;
  2. numărul total de birouri ale clădirii cu număr maxim de niveluri.

Date de intrare

Fișierul de intrare birouri.in conține pe prima linie una dintre valorile 1 sau 2, reprezentând cerinţa 1, dacă se cere determinarea numărului maxim de niveluri pe care le poate avea clădirea, respectiv cerinţa 2, dacă se cere determinarea numărului total de birouri al clădirii cu număr maxim de niveluri.

Linia a doua conţine un număr natural n (reprezentând lungimea fiecărui zid al primului nivel al clădirii)

Date de ieșire

Fișierul de ieșire birouri.out va conține pe prima linie pe prima linie un număr natural reprezentând numărul maxim de niveluri pe care le poate avea clădirea, dacă cerinţa a fost 1, respectiv un număr natural reprezentând numărul total de birouri ale clădirii cu număr maxim de niveluri, dacă cerinţa a fost 2.

Restricții și precizări

  • 3 ≤ n ≤ 32768
  • Pentru rezolvarea corectă a cerinţei 1 se acordă 30% din punctaj, iar pentru rezolvarea corectă a cerinţei 2 se acordă 70% din punctaj.

Explicație

Exemplul corespunde imaginii de mai sus. Clădirea cu nivelul de la bază de latură 10 va avea 5 niveluri.

Nivelul 6 nu se mai construieşte, deoarece nu ar conţine niciun birou.

Explicație

Clădirea cu 5 niveluri şi latura de la bază de lungime 10 are:

  • pe primul nivel 100 birouri;
  • pe nivelul doi 40 birouri;
  • pe nivelul trei 24 birouri;
  • pe nivelul patru 4 birouri;
  • pe nivelul cinci 4 birouri.

100 + 40 + 24 + 4 + 4 = 172

Încărcare soluție

Lipește codul aici

<syntaxhighlight lang="python" line="1"> ​n, m, k, c, niv, b, p = 0, 0, 0, 0, 0, 0, 0 fin = open('birouri.in', 'r') fout = open('birouri.out', 'w') c, n = map(int, fin.readline().split()) m = n while n != 0 and n % 2 == 0:

   niv += 1
   if niv % 2 == 1:
       b += n * m
   else:
       if n > m:
           k = m
       else:
           k = n
       p = k * k // 2 - k
       b += p
       if p == 0:
           niv -= 1
       if k % 4 == 0:
           k = k // 2
           n = k
           m = k
       else:
           n = n // 2 - 1
           m = n + 2

if c == 1:

   print(niv, file=fout)

else:

   print(b, file=fout)

fin.close() fout.close() </syntaxhighlight>