22. Dve slike na papiru rešenje
Uvodno objašnjenje
U ovom zadatku potrebno je ispitati koliko ispravnih rasporeda postoje za dve slike na papir poznatih dimenzija, uz određena ograničenja:
- Slike moraju biti cele prikazane na papiru, bez preklapanja.
- Slike se postavljaju paralelno sa ivicama papira (bez rotacije slika).
- Papir se može rotirati (horizontalna "pejzaž" i vertikalna "portret" orijentacija).
- Postavljanje slika može biti u dva osnovna rasporeda:
- Jedna ispod druge.
- Jedna pored druge.
U najviše četiri rasporeda može doći do postavljanja slika, ali neki od njih mogu biti neispravni zbog veličine papira u odnosu na slike.
Uputstvo za rešavanje
1. Ulazni podaci
Unosimo dimenzije papira, prve slike i druge slike:
- Širina i visina papira.
- Širina i visina prve slike.
- Širina i visina druge slike.
2. Rotacija papira
Razmatramo dva slučaja za papir:
- Horizontalna orijentacija (širina × visina).
- Vertikalna orijentacija (visina × širina).
3. Provera rasporeda slika
Za svaki slučaj postavljanja proveravamo:
- Da li slike mogu stati jedna ispod druge:
- Ukupna visina slika ≤ visina papira i širina svake slike ≤ širina papira.
- Da li slike mogu stati jedna pored druge:
- Ukupna širina slika ≤ širina papira i visina svake slike ≤ visina papira.
4. Rezultat
Broj ispravnih rasporeda može biti od 0 (nema ispravnih rasporeda) do 4 (sve kombinacije su ispravne). Broj ispravnih rasporeda ispisujemo na izlaz.
Napomena
- Razmisliti o svim kombinacijama dimenzija papira i slika, posebno vodeći računa o tome da se papir može rotirati.
- U slučaju da nijedan raspored nije validan, rezultat je 0.
Rešenje 1
#include <iostream> // Omogućava rad sa ulazom i izlazom using namespace std; // Koristi standardni prostor imena int main() { int w, h, pw1, ph1, pw2, ph2; // Deklarišu dimenzije papira (w, h) i dimenzije slika (pw1, ph1, pw2, ph2) cin >> w >> h >> pw1 >> ph1 >> pw2 >> ph2; // Unos dimenzija papira i slika int b = 0; // Brojač validnih rasporeda slika // 1. Provera prvog rasporeda: slike pored int pwu = pw1 + pw2; // Ukupna širina slika pored int phu = (ph1 > ph2) ? ph1 : ph2; // Maksimalna visina slika if(w >= pwu && h >= phu) { b++; // Ako je širina i visina papira dovoljna, povećava brojač } // 2. Provera drugog rasporeda: slike ispod pwu = ph1 + ph2; // Ukupna visina slika ispod phu = (pw1 > pw2) ? pw1 : pw2; // Maksimalna širina slika if(w >= pwu && h >= phu) { b++; // Ako je širina i visina papira dovoljna, povećava brojač } // 3. Provera trećeg rasporeda: slike pored (rotirane) pwu = pw1 + pw2; // Ukupna širina slika pored phu = (ph1 > ph2) ? ph1 : ph2; // Maksimalna visina slika if(h >= pwu && w >= phu) { b++; // Ako je visina i širina papira dovoljna za rotirane slike, povećava brojač } // 4. Provera četvrtog rasporeda: slike ispod (rotirane) pwu = ph1 + ph2; // Ukupna visina slika ispod phu = (pw1 > pw2) ? pw1 : pw2; // Maksimalna širina slika if(h >= pwu && w >= phu) { b++; // Ako je visina i širina papira dovoljna za rotirane slike, povećava brojač } cout << b << endl; // Ispisuje broj validnih rasporeda slika return 0; // Završava program }
Ovaj program uzima dimenzije papira i dve slike i proverava da li slike mogu stati na papir u različitim rasporedima. Program proverava četiri mogućnosti: slike pored, slike ispod, slike pored sa rotacijom i slike ispod sa rotacijom. Za svaki od rasporeda proverava se da li širina i visina papira mogu da prime slike, i broji koliko rasporeda je validno.
Detaljan opis:
- Unos dimenzija: Program uzima dimenzije papira (širina i visina) kao i dimenzije dve slike (širina i visina prve i druge slike) putem
cin
komande. - Provera rasporeda: Program proverava četiri rasporeda slika:
- Prvi raspored (slike pored): Ako ukupna širina slika (suma širina obe slike) ne prelazi širinu papira, a visina papira je dovoljna za najveću visinu slika, brojač validnih rasporeda se poveća.
- Drugi raspored (slike ispod): Ako ukupna visina slika (suma visina obe slike) ne prelazi visinu papira, a širina papira je dovoljna za najveću širinu slika, brojač validnih rasporeda se poveća.
- Treći raspored (slike pored, rotirane): Ako visina papira može da primi ukupnu širinu slika, a širina papira može da primi najveću visinu slika, brojač validnih rasporeda se poveća.
- Četvrti raspored (slike ispod, rotirane): Ako visina papira može da primi ukupnu širinu slika, a širina papira može da primi najveću visinu slika, brojač validnih rasporeda se poveća.
- Ispis rezultata: Na kraju, program ispisuje broj validnih rasporeda slika na papiru.
Na kraju, program vraća 0, što označava da je izvršenje uspešno završeno.
Rešenje 2
#include <iostream> // Omogućava rad sa ulazom i izlazom #include <cmath> // Omogućava korišćenje matematičkih funkcija poput abs using namespace std; // Koristi standardni prostor imena int main() { int papir_sirina, papir_visina, slika1_sirina, slika1_visina, slika2_sirina, slika2_visina; // Deklarišu se dimenzije papira i slika cin >> papir_sirina >> papir_visina >> slika1_sirina >> slika1_visina >> slika2_sirina >> slika2_visina; // Unos dimenzija papira i slika int ispravni_rasporedi = 0; // Brojač ispravnih rasporeda slika if ((slika1_sirina + slika2_sirina <= papir_sirina && max(slika1_visina, slika2_visina) <= papir_visina) // Provera rasporeda slika pored || (slika1_visina + slika2_visina <= papir_visina && max(slika1_sirina, slika2_sirina) <= papir_sirina)) { ispravni_rasporedi++; // Raspored slika pored je ispravan } if ((slika1_sirina + slika2_sirina <= papir_visina && max(slika1_visina, slika2_visina) <= papir_sirina) // Provera rasporeda slika ispod || (slika1_visina + slika2_visina <= papir_sirina && max(slika1_sirina, slika2_sirina) <= papir_visina)) { ispravni_rasporedi++; // Raspored slika ispod je ispravan } cout << ispravni_rasporedi << endl; // Ispisuje broj ispravnih rasporeda slika return 0; // Završava program }
Ovaj program proverava da li dve slike mogu stati na papir u različitim rasporedima. Program proverava dva osnovna rasporeda: slike pored (horizontalno) i slike ispod (vertikalno). Takođe, proverava i rotirane varijante tih rasporeda. Na kraju, program broji koliko rasporeda može stati na papir i ispisuje taj broj.
Detaljan opis:
-
Unos dimenzija:
Program uzima dimenzije papira i dve slike (širina i visina) putem
cin
komande. -
Provera rasporeda:
Program proverava dva rasporeda slika:
-
Raspored slika pored:
Program proverava da li je zbir širina oba slike manji ili jednak širini papira i da li je najveća visina slika manja ili jednaka visini papira. Takođe, proverava i obrnuti raspored sa rotacijom slika.
-
Raspored slika ispod:
Program proverava da li je zbir visina slika manji ili jednak visini papira i da li je najveća širina slika manja ili jednaka širini papira, kao i rotiranu varijantu.
-
Raspored slika pored:
-
Raspored sa rotacijom:
Ako slike ne stanu u originalnom obliku, proveravaju se i rotirane varijante tih rasporeda. Program koristi funkciju
max
kako bi odredio koja dimenzija slika je veća, kako bi pravilno uporedio sa dimenzijama papira. -
Brojač ispravnih rasporeda:
Za svaki validan raspored koji može stati na papir, brojač
ispravni_rasporedi
se uvećava. Na kraju, program ispisuje ukupan broj ispravnih rasporeda.
Na kraju, program vraća 0, što označava da je izvršenje uspešno završeno.
Poređenje rešenja
1. Tačnost
Oba rešenja imaju isti cilj: proveriti da li dve slike mogu stati na papir u različitim rasporedima. Međutim, oba rešenja ne obuhvataju sve moguće rotacije i rasporede.
- Prvo rešenje: proverava sve moguće rasporede sa rotacijama za oba rasporeda (horizontalni i vertikalni), što znači da su pokriveni svi osnovni slučajevi.
- Drugo rešenje: koristi
max()
za određivanje veće dimenzije i proverava samo osnovne rasporede, bez eksplicitne rotacije. S obzirom na to da funkcijamax()
upravlja time da bude uzeta veća dimenzija, ono takođe pokriva većinu slučajeva, ali bez direktnog navođenja rotacija.
2. Efikasnost
Oba rešenja rade u konstantnom vremenu, jer se svi potrebni proračuni vrše u nekoliko osnovnih uslova.
- Prvo rešenje: se sastoji od četiri jednostavna uslova, svaki sa osnovnim proračunima i poređenjima.
- Drugo rešenje: je nešto kraće i koristi funkciju
max()
za kraći i jasniji kod, ali postiže isti rezultat u istom vremenskom okviru.
3. Jednostavnost i čitljivost
- Prvo rešenje: ima više izraženih komentara za svaki deo koda, ali upotreba više promenljivih za proračun širine i visine može učiniti kod nešto manje preglednim.
- Drugo rešenje: je jednostavnije, jer koristi direktne funkcije i kraći kod za izvršenje, što čini kod lakšim za razumevanje i održavanje.
4. Proširivost
- Prvo rešenje: bi bilo lakše proširiti ako želimo dodati dodatne rasporede ili rotacije, jer su svi rasporedi posebno definisani.
- Drugo rešenje: je već optimizovano za osnovne slučajeve, ali bi u slučaju potrebe za dodatnim rasporedima ili rotacijama zahtevalo značajnije izmene.
5. Korišćenje standardnih biblioteka
- Prvo rešenje: koristi samo osnovne uslove i matematičke operacije, bez potrebe za dodatnim bibliotekama.
- Drugo rešenje: koristi biblioteku
cmath
i funkcijumax()
, što je jednostavno i efikasno za određivanje većih dimenzija, ali uključuje dodatnu biblioteku.
Zaključak:
- Prvo rešenje: je detaljnije u pogledu tačnosti, jer explicitno proverava sve rotacije i rasporede. To znači da je kod precizniji, ali možda malo duži.
- Drugo rešenje: je jednostavnije i kraće, koristi
max()
za kraći kod i može biti bolje za jednostavnije slučajeve, ali je manje precizno kada su rotacije i dodatni rasporedi važni.
Oba rešenja su efikasna i tačna za osnovne slučajeve, ali prvo rešenje je bolje za detaljnije proveru rasporeda i rotacija.