3577 - Origami 1

From Bitnami MediaWiki

Enunt[edit | edit source]

Costel este pasionat de arta orientală a confecţionării obiectelor de hârtie, origami, dar este abia la început şi trebuie să se familiarizeze cu operaţiile de îndoire corectă a hârtiei. El are la dispoziţie o foaie de hârtie pătrată, ruptă dintr-un caiet de matematică, având dimensiunea de exact N x N pătrăţele. Îndoiturile trebuie realizate exact pe o linie orizontală sau verticală. Sunt permise două tipuri de îndoituri:

îndoitura de tipul 1, îndoitură verticală executată la X pătrăţele faţă de marginea stângă a foii: partea din stânga a foii se pliază către dreapta, de-a lungul liniei verticale aflate la distanţa de X pătrăţele faţă de marginea stângă; îndoitura de tipul 2, îndoitură orizontală executată la X pătrăţele faţă de marginea superioară a foii: partea de sus a foii se pliază în jos, de-a lungul liniei aflate la distanţa de X pătrăţele faţă de marginea de sus a hârtiei.

În urma realizării unei succesiuni de îndoituri, din foaia iniţială de hârtie se va obţine un obiect, care va avea o formă dreptunghiulară, cu înălţimea H, lăţimea M şi având grosimea egală cu numărul maxim de foi care se suprapun în cadrul obiectului obţinut.

Cerinţa[edit | edit source]

Dată fiind o succesiune de îndoituri aplicată unei foi de dimensiune N x N, scrieţi un program care să determine înălţimea, lăţimea şi grosimea obiectului obţinut.

Date de intrare[edit | edit source]

Fişierul de intrare origami1.in are următoarea structură :

  • prima linie a fişierului conţine un număr natural N, reprezentând dimensiunea iniţială a hârtiei;

a doua linie conţine un număr natural K, reprezentând numărul îndoiturilor;

  • pe următoarele K linii se găsesc perechi de numere naturale nenule, A B, separate printr-un spaţiu, reprezentând tipul îndoiturii ( A este 1 dacă se realizează o îndoitură verticală sau A este 2 dacă se realizează o îndoitură orizontală), respectiv la ce distanţă se realizează îndoitura;

Date de ieșire[edit | edit source]

Fişierul de ieşire origami1.out va conţine, pe o singură linie, trei numere naturale nenule H, L, G, separate prin câte un spaţiu, reprezentând înălţimea, lăţimea şi respectiv grosimea obiectului obţinut.

Restricţii şi precizări[edit | edit source]

  • 2 ≤ N ≤ 170
  • 1 ≤ K ≤ 2N-2
  • A = 1 sau A = 2
  • 1 ≤ B < înălţimea sau lăţimea hârtiei la momentul respectiv (funcţie de tipul îndoiturii)

Exemplu[edit | edit source]

origami1.in
4
3
1 3
2 3
1 1
origami1.out
3 2 6


Explicație[edit | edit source]

Hârtia are 4 unităţi înălţime şi 4 unităţi lăţime. Prima îndoitură se realizează de la stânga la dreapta, de-a lungul celei de-a treia linii verticale faţă de marginea stângă a foii. Se obţine o foaie de înălţime 4, lăţime 3 şi grosime 2. A doua îndoitură se realizează îndoind partea superioară a foii, în jos, de-a lungul celei de-a treia linii orizontale faţă se marginea de sus a foii. Se obţine un obiect de înălţime 3, lăţime 3 şi grosime 4. După a treia îndoitură se obţine obiectul final, având înălţimea 3, lăţimea 2 şi grosimea 6.

Rezolvare[edit | edit source]

<syntaxhighlight lang="python" line> def fold_paper(N, K, folds):

   height = N
   width = N
   thickness = 1
   for fold_type, position in folds:
       if fold_type == 1:
           # Îndoitură verticală
           width = min(position, N - position)
           thickness *= 2
       elif fold_type == 2:
           # Îndoitură orizontală
           height = min(position, N - position)
           thickness *= 2
   return height, width, thickness

def main():

   with open("origami1.in", "r") as fin:
       N = int(fin.readline())
       K = int(fin.readline())
       folds = [list(map(int, fin.readline().split())) for _ in range(K)]
   height, width, thickness = fold_paper(N, K, folds)
   with open("origami1.out", "w") as fout:
       fout.write(f"{height} {width} {thickness}\n")

if __name__ == "__main__":

   main()

</syntaxhighlight>