четвртак, 25. јануар 2018.

Takmicenje iz programiranja 2017 - Kvalifikacije - 2. krug - Zadatak 1 - Resenje

Drage takmičarke i dragi takmičari,
 
Kako ste skoro svi pokušavali da rešite 1. zadatak Mala matrica, baš korišćenjem tipa podataka za matricu dimenzija 2x3, a kako je bio veliki broj grana (pa i begin-a i end-a u granama) i višestrukih else grana, na osnovu svih vaših verzija, napravio sam i objedinio kod, a zatim ga samo malo preuredio kako bi bio pregledniji.

Takođe, u ovom zadatku akcenat nije na optimizaciji vremena, te sam izbacio status, a sređivanje druge kolone vratio na početak koda. Tačnije status nisam potpuno izbacio, već sam umesto promenljive R za status koristio ukupan broj nula (N4, kao i N1 i N3) i upit da li je trenutni zbir prve levo i poslednje desno (S1 i S3) različit.
 
Obratite pažnju na ukupan broj nula (N4) i nekoliko stanja koji se nadovezuju redom počev od stanja kada je ukupan broj nula najmanje 4, pa zatim 3, 2, 1 i 0. U svakoj od ovih kombinacija, ažuriraju se podaci o ukupnom broju nula. Posebnu pažnju obratite kada je broj nula 3, zamenjuje se jedna (jedina nula u odgovarajućoj koloni) a broj nula se ažurira na 2. Tok algorirma je takav, da nakon rešavanja situacije kada je broj nula 3 se svodi na rešavanje situacije kada je broj nula 2, odnosno nastavlja ("propada") аlgoritamski tok na sledeću kombinaciju (redom).
 
Malo sam izmenio glavni scenario algoritma, kako bi bio u sledećem grubom redosledu:
  1. Učitavanje matrice
  2. Tipove podataka za elemente matrice i zbirove kolona na Int64.
  3. Postavljanje svih nula u drugoj koloni na jedinice.
  4. Prebrojavanje nula u prvoj i trećoj koloni i izraćunavanje zbira elemenata prve i treće kolone.
  5. Ako je ukupan broj nula 4 ili veći, postavljamo sve elemente na 1, a broj nula na nula.
  6. Ako je ukupan broj nula 3, postavljamo jedinu nulu u koloni koja ima samo jednu nulu na 1, a ukupan broj nula na 2, time stanje svodimo na deo zadatka sa 2 nule.
  7. Ako je ukupan broj nula 2, prvo proveravamo da li su obe u jednoj od kolona i ukoliko jesu prepisujemo iz supronte kolone, u suprotnom odrđujemo veći element pa u toj koloni postavljamo 1, a zatim ukupan broj nula na 1.
  8. Nakon toga računamo apsolutnu razliku (SR) zbirova prve i treće kolone.
  9. Ako je ukupan broj nula 1 i apsolutna razlika veće od nule, nulu postavljamo na vrednost apsolutne razlike.
  10. Ponovo računamo zbir prve i treće kolone i proveremo da li se razlikuju ili ne, jer u zavisnosti od toga štampamo vrednost -1 ili vrednosti elememenata matrice.
Kada budete imali vremena obavezno detaljno proučite i proverite ovaj programski kod (u prilogu) jer je najpribližniji zajedničkom preseku svih rešenja takmičara iz naše škole.
 
Ova verzija programskog koda zadatka 01 Mala matrica, prolazi sve pripremljene test primere, odnosno osvojila bi maksimalan broj bodova (100), što možete i sami da proverite direktno (onlajn) do 28.01 na:
Pozdrav,
Dragan Ilić

Нема коментара: