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 izlazomusingnamespacestd; // Koristi standardni prostor imenaintmain() {
            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 slikaint b = 0; 
            // Brojač validnih rasporeda slika// 1. Provera prvog rasporeda: slike poredint pwu = pw1 + pw2; 
            // Ukupna širina slika poredint phu = (ph1 > ph2) ? ph1 : ph2; 
            // Maksimalna visina slikaif(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 slikaif(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 slikaif(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 slikaif(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 slikareturn 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:
    1. 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.
    2. 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.
    3. 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.
    4. Č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 absusingnamespacestd; // Koristi standardni prostor imenaintmain() {
            int papir_sirina, papir_visina, slika1_sirina, slika1_visina, slika2_sirina, slika2_visina; 
            // Deklarišu se dimenzije papira i slikacin >> papir_sirina >> papir_visina >> slika1_sirina >> slika1_visina >> slika2_sirina >> slika2_visina; 
            // Unos dimenzija papira i slikaint ispravni_rasporedi = 0; 
            // Brojač ispravnih rasporeda slikaif ((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 slikareturn 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:

    1. 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.

    2. 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 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 funkcija max() 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 funkciju max(), š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.