Docsity
Docsity

Pripremite ispite
Pripremite ispite

Studirajte zahvaljujući brojnim resursima koji su dostupni na Docsity-u


Nabavite poene za preuzimanje
Nabavite poene za preuzimanje

Zaradite bodove pomažući drugim studentima ili ih kupite uz Premium plan


Školska orijentacija
Školska orijentacija


PROGRAMIRANJE, Beleške od Programiranje

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

2022/2023

Učitan datuma 13.01.2023.

IskraButkovic
IskraButkovic 🇭🇷

5

(2)

3 dokumenti

1 / 12

Toggle sidebar

Ova stranica nije vidljiva u pregledu

Ne propustite važne delove!

bg1
SREDNJA ŠKOLA
PROGRAMIRANJE
pf3
pf4
pf5
pf8
pf9
pfa

Delimični pregled teksta

Preuzmite PROGRAMIRANJE i više Beleške u PDF od Programiranje samo na Docsity!

SREDNJA ŠKOLA

PROGRAMIRANJE

Uputstva takmičarima

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:

  1. Poruku konvertujemo Morzeovom azbukom bez pauza, ali dodamo na kraj brojeve koji označavaju dužine Morzeovih kodova.
  1. Okrenemo brojeve sa kraja stringa.
  2. Konvertujemo tačke i crte nazad u slova koristeći obrnuti niz brojeva kao dužine kodova.

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 #include <stdio.h> #include <string.h> using namespace std;

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 

A

dp

dpi  max (^) ji { AiAjdpj }

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 * xBx }

Gornja formula nam omogućava implementaciju složenosti O(N*2001).

#include #include

#include #include #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 ];