3577 - Origami 1
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>