






Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u
Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan
Pripremite ispite
Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u
Nabavite poene za preuzimanje
Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan
od sljedećih programskih jezika: Pascal, C, C++ ili Java. ... izvornim kôdovima rješenja. ... Ne smijete postavljati pitanja u vezi rješavanja zadataka.
Tipologija: Beleške
1 / 12
Ova stranica nije vidljiva u pregledu
Ne propustite važne delove!







Ovo takmičenje sastoji se od rješavanja 3 problemska zadatka u vremenu od 4 sata (240 minuta). Zadatke je potrebno rješavati u jednom od sljedećih programskih jezika: Pascal, C, C++ ili Java. Takmičari koji koriste Pascal moraju programirati u programskom alatu FreePascal ili TurboPascal. Takmičari u C-u i C++-u moraju koristiti programske alate CodeBlocks , DJGPP, DevCpp ili GCC. Za programski jezik Java predviđena je upotreba platforme Eclipse. Dozvoljeno je koristiti editor po izboru i pomoću navedenih alata prevoditi izvorni kod u izvršnu datoteku.
Tokom takmičenja ne smijete komunicirati ni sa jednom osobom, osim dežurne osobe takmičenja. To znači da morate raditi samostalno i ne smijete koristiti Internet. Takođe, zabranjena je upotreba bilo kakvih ranije napisanih programa ili dijelova programa.
Po isteku vremena predviđenog za takmičenje, na desktopu u folderu sa imenom Takmicenje2014 moraju se nalaziti datoteke sa snimljenim izvornim kôdovima rješenja. Nakon takmičenja, komisija će testirati vaša rješenja na ranije izabranim test podacima i dodijeliti vam određeni broj bodova. Na kraju svakog zadatka dati su primjeri test podataka. Ti primjeri služe da bi vam tekst zadataka bio što je moguće jasniji te za provjeru formata ulaza i izlaza, a ne služe za provjeru ispravnosti vašeg programa. Ako vaš program radi na tim primjerima, to nije garancija da će raditi na službenim podacima za testiranje.
Zadaci ne nose jednak broj bodova. Lakše i brže rješivi zadaci nose manje bodova, dok teži nose više bodova. Svaki test podatak u nekom zadatku nosi jednak broj bodova. Ukupan broj bodova na nekom zadatku jednak je zbiru bodova test podataka koji se poklapaju sa službenim rješenjem. Ukupan broj bodova jednak je zbiru bodova na svim zadacima.
Sve informacije o zadacima (ime zadatka, vremensko i memorijsko ograničenje, način bodovanja) možete naći na uvodnoj stranici s naslovom Zadaci. Ako vam nije jasno nešto u vezi načina organizacije ovog takmičenja, odmah postavite pitanje dežurnom da vam to razjasni.
Tokom cijelog takmičenja možete postavljati pitanja dežurnom u vezi zadataka. Dozvoljena su pitanja koja razjašnjavaju nejasnoće u tekstu zadatka. Ne smijete postavljati pitanja u vezi rješavanja zadataka. Prije nego postavite pitanje, pročitajte još jednom zadatak, jer je moguće da ste u prethodnom čitanju preskočili dio teksta zadatka.
VAŢNO za C/C++!
Glavni program (glavna funkcija) mora biti deklarisan kao: int main(void) { … }.
Program mora završiti svoje izvođenje naredbom return 0; unutar funkcije main ili naredbom exit(0);.
Zadaci
Zadatak Zadatak1 Zadatak2^ Zadatak
Izvorni kôd
zadatak1.java zadatak1.pas zadatak1.c zadatak1.cpp
zadatak2.java zadatak2.pas zadatak2.c zadatak2.cpp
zadatak3.java zadatak3.pas zadatak3.c zadatak3.cpp Memorijsko ograničenje 64 MB^ 256 MB^ 64 MB
Vremensko ograničenje (po test podatku)
1 sekunda 2 sekunde 2 sekunde
Broj test podataka 10 10 10
Broj bodova (po test podatku)^3 3.5^ 3.
Ukupno bodova 30 35 35
Napomena: Program u C-u i C++-u treba kompajlirati sa sljedećim opcijama: – O2 – lm – static , a program u Pascalu sa – O1 – XS.
for (int x = n+1; x <= n*2; ++x) { if (x * n % (x-n) == 0) ++c; } return c; }
Zadatak 2 – Šifra
Jelena i Nikola se dopisuju, ali ne žele da drugi čitaju njihove poruke. Osim što koriste engleski jezik, oni su dodatno osigurali svoje poruke tako što su uveli svoj sistem kodiranja poruka. Istini za volju, sistem nije baš nov, jer se zasniva na Ohaverovom šifriranju, a ono se bazira na Morzeovoj azbuci, koja kodira svako slovo nizom tačaka i crtica. Sljedeća tabela prikazuje Morzeov kod za sva slova engleske abecede:
Postoje 4 kombinacije tačaka i crtica koje nijesu dodijeljene, pa su ih Jelena i Nikola iskoristili na sljedeći način (ove 4 kombinacije nijesu dio startne Morzeove azbuke):
Donja crta (“_”) ..-- Zapeta (“,”) .-.- Tačka (“.”) ---. Upitnik (“?”) ----
U praksi, znaci poruke razdvojeni su kratkom pauzom, koja se obično predstavlja blanko znakom. Npr. poruka NY_REGION će biti šifrirana kao:
-. -.-- ..-- .-.. --. .. --- -.
Jelena i Nikola kodiraju poruku tako što uklone pauze između slova. Jasno je da tako dobijeni niz znaka može predstavljati više riječi. Na primjer, poruka “.--.-.--” može se tumačiti kao “ACM” ili “ANY”, a to nijesu jedine mogućnosti. Ako na kraj stringa dodamo informaciju o dužini, kao npr. “.--.-.-- 242”, tada je kod nedvosmislen. Dakle, njihov postupak može se opisati sa sljedeća tri koraka:
Na primjer, neka šifriramo poruku “AKADTOF_IBOETATUK_IJN”. Konvertovanje u Morzeov kod sa dužinama na kraju daje:
.--.-.--..----..-...--..-...---.-.--..--.-..--...----. 232313442431121334242
Okretanjem niza brojeva dobijamo 242433121134244313232, pa sada taj niz koristimo za dešifrovanje i dobijamo originalnu poruku “ACM_GREATER_NY_REGION”. Jasno je da sigurnost ovog metoda nije pretjerano velika, ali Jelena i Nikola misle da je dovoljna za njihove potrebe. Pomozite im da implementiraju ovaj algoritam dešifriranja.
Ulazni podaci Jedini red ulaza sadrži jednu poruku šifriranu Jeleninim i Nikolinim sistemom. Svaka poruka se sastoji od velikih slova engleske abecede, tačaka, donjih crta, zapeta i upitnika i nije duža od 1000 znaka.
Izlazni podaci U jedinom redu izlaza štampati dešifriranu poruku.
Test primjeri
Ulaz Izlaz
FENDSVTSLHW.EDATS,EULAY FALSE_SENSE_OF_SECURITY
TRDNWPLOEF CTU_PRAGUE
NTTTGAZEJUIIGDUZEHKUE TWO_THOUSAND_THIRTEEN QEWOISE.EIVCAEFNRXTBELYTGD. QUOTH_THE_RAVEN,_NEVERMORE.
?EJHUT.TSMYGW?EJHOT TO_BE_OR_NOT_TO_BE?
DSU.XFNCJEVE.OE_UJDXNO_YHU?VIDWDHPDJIKXZT?E THE_QUICK_BROWN_FOX_JUMPS_OVER_THE_LAZY_DOG
Rješenje : Ovaj zadatak je klasičan primjer simulacije – samo je potrebno pažljivo implementirati opisani postupak dešifriranja.
#include
char* codes[] = {".-", "-...", "-.-.", "-..", ".", "..-.", "--.", "....", "..", ".---", "-.-", ".-..", "--", "-.", "---", ".--.", "--.-", ".-.", "...", "-", "..-", "...-", ".--", "-..-", "-.--", "--.."};
outputlinija[out] = '\0'; printf("%s\n", outputlinija); } return 0; }
Zadatak 3 – Igra
Dino i Ana igraju jednu zanimljivu igru. Dino na (jako dugačkom) papiru napiše N brojeva. Ana tada uzima olovku i precrta neke od tih brojeva. Nakon toga se svi neprecrtani brojevi prepisuju na novi papir u istom poretku, a Ana dobija bodove tako što sabira proizvode dva susjedna broja. Na primjer, ako je prepisani niz {3, 6, -1, 2 }, tada Ana dobija 36 + 6(-1)+(-1)*2 = 10 bodova. Ukoliko prepisani niz ima manje od 2 broja, Ana dobija nula bodova. Ana je u nedoumici: ne zna koje brojeve treba precrtati na Dinovom spisku tako da ostvari maksimalni mogući broj bodova. Napišite program koji će odrediti taj maksimalni mogući broj bodova.
Ulazni podaci
U prvom redu se nalazi broj N (3 ≤ N ≤ 30 000), koliko ima brojeva zapisanih na Dinovom papiru. U svakom od sljedećih N redova nalazi se po jedan realan broj Xi (-10.00 ≤ Xi ≤ 10.00) sa Dinovog papira, zapisan sa tačno dvije decimale, sa nulama na kraju ako je potrebno.
Izlazni podaci
U prvi i jedini red štampati maksimalni broj bodova koje Ana može dobiti. Rezultat je potrebno štampati sa tačno četiri decimalna mjesta.
Test primjeri
Ulaz Izlaz 3
5
3
Rješenje : Ovaj zadatak se rješava dinamičkim programiranjem. Definišemo niz dp{i} kao najveću vrijednost niza kod kojeg posljednji član se nalazi na poziciji i. Sada je lako naći rekurzivnu formulu (A1, A2, …, AN} je vrijednost ulaznog niza):
0
0
dp
dpi max (^) j i { Ai Aj dpj }
Ova implementacija ima složenost O(N^2 ), što nije dovoljno brzo. Sada ćemo primijetiti da mogućih vrijednosti elemenata ima veoma malo: tačnije, ima ih samo 2001 (brojeva sa tačno dvije decimale iz intervala [- 10.00, +10.00]). Prepravimo algoritam na sljedeći način: sekvencijalno ćemo izračunavati vrijednosti niza dp za sve članove od 1 do N; izračunavanje same vrijednosti ubrzavamo tako što umjesto da biramo mjesto j na koje će se taj niz nastavljati, biramo vrijednost posljednjeg mjesta Aj. Sada je jedini član u gornjoj rekurzivnoj formuli koji ne znamo dpj , ali u formuli vidimo da nas jedino zanima mjesto na kojem je taj dpj maksimalan. Zbog toga ćemo uvesti pomoćni niz Bx koji će nam govoriti maksimalnu do sada viđenu vrijednost dpz takvu da je Az = x. Sada rekurzivna formula postaje:
dpi max (^) x [ 10. 00 , 10. 00 ]{ Ai * x Bx }
Gornja formula nam omogućava implementaciju složenosti O(N*2001).
#include
#include
#include
using namespace std;
const int MAXN = 30100; const int MAXVAL = 2001;
int n, A[ MAXN ];
long long dp[ MAXN ]; long long Maks_dp[ MAXVAL ];
char Ima[ MAXVAL ];