Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 49

1.

Uvod u algoritme / Hello BubbleBee! / SUB1


Sabiranje 1
Problem
Istorija
Komentari

Status: Reen
Id: SUB1
Izvor: BubbleBee Tim
Tip: Basic
Teina: 1
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 5
Uspenost: 25% (2/8)
Problem Statement
Data su dva cela broja A i B. Izraunati njihov zbir.
Input
U prvom redu standardnog ulaza se nalaze dva cela broja A i B odvojena jednim razmakom.
Output
U prvom redu standardnog izlaza ispisati zbir brojeva A i B.
Example
Example Input

Example Output

29 3

32

Constrains
-10^5 <= A, B <= 10^5
Resenje:
#include <stdio.h>
#include <stdlib.h>
int main()
{ int a,b;
scanf("%d%d", &a, &b);
printf("%d\n", a+b);
return 0;
}
Uvod u algoritme / Hello BubbleBee! / SAB2
Sabiranje 2
Problem
Istorija
Komentari

Status: Reen
Id: SAB2
Izvor: BubbleBee Tim
Tip: Training
Teina: 1
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 5
Uspenost: 100% (2/2)
Problem Statement
Data su dva cela broja A i B. Izraunati njihov zbir.
Input
U prvom redu standardnog ulaza se nalaze dva cela broja A i B odvojena jednim razmakom.
Output
U prvom redu standardnog izlaza ispisati zbir brojeva A i B.
Example
Example Input

Example Output

-5 5

Constrains
-10^12 <= A, B <= 10^6
Resenje:
#include <stdio.h>
#include <stdlib.h>
int main()
{ long long int a,b;
scanf("%lld %lld", &a, &b);
printf("%lld\n", a+b);
return 0;
}
Resenje 2:
#include <stdio.h>
#include <stdlib.h>
int main()
{ long long int a,b;
scanf("%I64d %I64d", &a, &b);
printf("%I64d\n", a+b);
return 0;
}
3.
Uvod u algoritme / Hello BubbleBee! / SAB3
Sabiranje 3
Problem
Istorija
Komentari

Status: Reen
Id: SAB3
Izvor: BubbleBee Tim
Tip: Training
Teina: 1
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 5
Uspenost: 100% (1/1)
Problem Statement
Data su realna broja A i B. Izraunati njihov zbir.
Input
U prvom redu standardnog ulaza se nalaze dva realna broja A i B (zadati na do 10 decimala) odvojena jednim
razmakom.
Output
U prvom redu standardnog izlaza ispisati zbir brojeva A i B zaokruen na 8 decimala.
Example
Example Input

Example Output

3.4567213274 51.142

54.59872133

Constrains
-10^6 <= A, B <= 10^6
Resenje:
#include <stdio.h>
#include <stdlib.h>
int main()
{ double a,b;
scanf("%lf%lf", &a, &b);
printf("%.8lf\n", a+b);
return 0;
}
4.
Uvod u algoritme / Hello BubbleBee! / SAB4
Sabiranje 4
Problem
Istorija
Komentari

Status: Reen
Id: SAB4
Izvor: BubbleBee Tim
Tip: Master
Teina: 2
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 10

Uspenost: 50% (1/2)


Problem Statement
Data su dva cela broja A i B. Izraunati njihov zbir.
Input
U prvom redu standardnog ulaza se nalazi broj A. U drugom redu se nalazi broj B.
Output
U prvom redu standardnog izlaza ispisati zbir brojeva A i B.
Example
Example Input

Example Output

239786289364782346238746283746
82716297038199323712837283728

322502586402981669951583567474

Constrains
-10^1000 <= A, B <= 10^1000
Resenje:
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1001
int a[MAX+2],b[MAX+2],c[MAX+3];
/* broj cifara 1001+predznak*/
int main() {
char prvi,drugi, a1[1003], b1[1003];
int i,j,aDIM=0,bDIM=0,max;
//aDIM, bDIM je broj cifara u a,b ne racunajuci predznak
scanf("%s",a1); scanf("%s",b1);
prvi=a1[0]; drugi=b1[0];
aDIM=strlen(a1)-(a1[0]=='-');
bDIM=strlen(b1)-(b1[0]=='-');
for (i=0,j=0; i<strlen(a1); i++)
if (isdigit (a1[i])) a[j++]=a1[i]-'0';
for (i=0,j=0; i<strlen(b1); i++)
if (isdigit (b1[i])) b[j++]=b1[i]-'0';
if(prvi=='-')
for(i=0;i<aDIM;i++)
a[i]*=-1;
if(drugi=='-')
for(i=0;i<bDIM;i++)
b[i]*=-1;
max= (aDIM>bDIM) ? aDIM:bDIM;
for(i=0;i<=max;i++)
{
if(i<=aDIM)
c[max-i]+=a[aDIM-i];
if(i<=bDIM)
c[max-i]+=b[bDIM-i];

if(c[max-i]>9)
{
c[max-i]%=10;
c[max-i-1]++;
}
if(c[max-i]<-9)
{
c[max-i]+=10;
c[max-i-1]--;
}
}
i=0;
while(c[i]==0)
{i++;
if (i==MAX+3) {printf("0");return 0;}
}
if(c[i]>0)
{
for(j=1;j<max;j++)
if(c[max-j]<0)
{
c[max-j]+=10;
c[max-j-1]--;
}
}
else
{
for(j=1;j<max;j++)
if(c[max-j]>0)
{
c[max-j]-=10;
c[max-j-1]++;
}
}
while(c[i]==0) i++;
if(c[i]<0) printf("-");
for(j=i;j<max;j++) printf("%d",abs(c[j]));
return 0;
}
5.
Uvod u algoritme / Osnovni algoritmi sortiranja / NajmanjiNedostizanBroj
Najmanji nedostian broj
Problem
Istorija
Komentari

Status: Reen
Id: NajmanjiNedostizanBroj
Izvor: nepoznat
Tip: Training
Teina: 0
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 6
Uspenost: 100% (1/1)
Problem Statement
Dat je niz a od n prirodnih brojeva. Nai najmanji prirodan broj koji se ne moe predstaviti kao zbir nekih elemenata
niza. Svaki element niza moe uestvovati najvie jedanput kao sabirak u jednom zbiru.
Input
U prvom redu broj n, n1000000. U drugom redu n prirodnih brojeva manjih ili ijednakih milion, razdvojeni
razmacima.
Output
Najmanji prirodan broj koji se ne moe dobiti kao zbir nekih elemenata niza a.
Example
Example Input

Example Output

5
2 8 12 1 5

Resenje:
//Udi Manber 5.15
#include<stdio.h>
#include<algorithm>
using namespace std;
#define NMAX 1000000
unsigned a[NMAX];
int main()
{
long long s=0;
unsigned n,i;
scanf("%u",&n);
for(i=0;i<n;i++) scanf("%u",&a[i]);
sort(a,a+n);
for(i=0;i<n;i++)
if(a[i]>s+1) break;
else s+=a[i];
printf("%lld",s+1);
}
6.
Uvod u algoritme / Osnovni algoritmi sortiranja / Drva
Drva
Problem
Istorija
Komentari
Reenje

Status: Reen
Id: Drva
Izvor:CROATIAN OPEN COMPETITION IN INFORMATICS 2011/2012
Tip: Training
Teina: 0
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 10
Uspenost: 100% (1/1)
Problem Statement
Jedan drvosea ima zadatak da sakupi M metara drveta. On ima jednu specijalnu testeru, koja moe da se podesi na
odreenu visinu, i sama proe kroz red drvea i posee sve to je iznad te visine. Poto drvosea ne eli da odsee
vie drveta nego to mora, on trai tvoju pomo da mu pomognete da odredi koja je najvia mogua visina na koju
moe da podesi testeru a da posee dovoljnu koliinu drveta.
Input
Prva linija sadri ceo broj N koji odgovara broj drevea koji stoje u redu, i ceo broj M koji odgovara koliini drveta
koje treba da se sakupi.
Sledea linija sadri N celih brojeva Vi koji odgovaraju visini drvea u metrima.
Output
Jedan ceo broj L koji odgovara maksimalnoj visini testere koja bi posekla dovolju koliinu drveta.
Example
Example Input

Example Output

5 20
4 42 40 26 46

36

Example Description
Sa visinom testere 36, odsee se 6 metara drugog drveta, 4 metara treeg i 10 metara petog, to je ukupno 20 metara
Constrains
N <= 1 000 000
M <= 2 000 000 000
Vi <= 1 000 000 000
Obezbedjeno je da vai da SUM(Vi) >= M
Resenje:
#include <iostream>
#include <cstdio>
#include <climits>
#include <algorithm>
using namespace std;
#define NMAX 1000001
unsigned l[NMAX]; //visina drva
int main()
{
int m,n,i=1;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++) scanf("%u",&l[i]);
sort(l,l+n);
l[-1]=0;
long long int sum=l[n-1];
for(i=1;(sum-m+0.000000)/i < l[n-i-1];i++)
sum+=l[n-i-1];

printf("%lld\n",(sum-m)/i);
return 0;
}
Resenje 2:
Sortiramo niz V(i) nerastue (oznaimo ovako sortirani niz sa R(i)). Oznaimo sa S(i) (i=0..N-1) ukupnu koliinu
metara koju bi dobili ako bi testeru postavili na visinu R(i). Primetimo da je niz S(i) neopadajui i da je S(0)=0.
Kreui se kroz sortirani niz stabala raunamo elemente niza S(i) (S(i)=S(i-1)+i*(R(i-1)-R(i))) i traimo najvei
indeks k niza S(i) za koji je S(k)<M. Zatim, kao krajnje reenje uzimamo [Rk-(M-Sk)/(k+1)].
Alternativno reenje (prikazano dole) bilo bi preko binarne pretrage. Za neku konkretnu visinu testere proemo kroz
niz V(i) i izraunamo koliko bi metara drva dobili, pa u zavisnosti da li je ta koliina vea ili manja od M
usmeravamo (binarnu) pretragu u odgovarajuem pravcu.

#include<cstdio>
using namespace std;
int a[1000003];
#define MAX(a,b) a > b ? a : b
int main(int argc, char* argv[])
{
int n, m;
scanf("%d%d", &n, &m);
int max = 0;
for (int i = 0; i < n; i++)
{
scanf("%d", a+i);
max = MAX(max, a[i]);
}
int low = 0, high = max;
while (low < high)
{
int mid = (low + high + 1) / 2;
long long LogLength = 0;
for (int i = 0; i < n; i++)
{
LogLength += MAX(0, a[i] - mid);
if (LogLength > m)
{
break;
}
}
if (LogLength < m)
{
high = mid - 1;
}
else

{
low = mid;
}
}
printf("%d\n", low);
}
7.
Uvod u algoritme / Osnovni algoritmi sortiranja / UnijaIntervala
UnijaIntervala
Problem
Istorija
Komentari
Reenje

Status: Reen
Id: UnijaIntervala
Izvor: N/A
Tip: Training
Teina: 0
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 9
Uspenost: 100% (1/1)
Problem Statement
U datom nizu celobrojnih vrednosti, nai broj koji se nalazi na poziciji M kada je niz sortiran neopadajue (brojanje
pozicije poinje od nule).
Niz je zadat intevalima. Npr, intervali {1, 3} i {5, 7} prestavljaju niz {1,2,3,5,6,7}. Jedan broj se moe nai u vie
intervala, npr. intervali {1,4} i {3, 5} prestavljaju niz {1, 2, 3, 3, 4, 4, 5}.
Input
Na prvroj liniji se nalazi broj intervala N i index traenog elementa M.
Na drugoj liniji se nalazi niz celobrojnih vrednosti koji prestavljaju donju granicu intervala.
Na treoj linije se nalazi niz celobrojnih vrednosti koji predstavljaju gornju granicu intervala.
Output
Jedan ceo broj, lan zadatog niza sa indeksom M.
Example
Example Input

Example Output

34
153
375

Example Description
Dati intervali su {1, 3}, {5, 7} i {3, 5}, koji opisuju niz {1, 2, 3, 3, 4, 5, 5, 6, 7}
Constrains
N < 1 000 000
M < 2, 000 000 000
Start[i] >= - 100 000 000
End[i] <= 100 000 000
Resenje:

#include<cstdio>
#include<cmath>
#include <climits>
#include <algorithm>
using namespace std;
#define NMAX 1000000
int poceci[NMAX], zavrseci[NMAX];
int main()
{
int n,m,i, poc, kraj,sred;
long long brx,bry; //prebroj fragmente intervala
scanf("%d%d", &n, &m);
poc = INT_MAX; kraj = INT_MIN;
for (i=0; i<n; i++)
{
scanf("%d", &poceci[i]);
poc=(poc<poceci[i])?poc:poceci[i];
}
for (i=0;i<n;i++)
{
scanf("%d", &zavrseci[i]);
kraj=(kraj>zavrseci[i])?kraj:zavrseci[i];
}
while (poc<kraj) //bsearch
{
sred = (int)floor((poc+kraj)/2.0);
brx = 0; bry = 0;
for (i=0;i<n;i++)
{ int duz=zavrseci[i]-poceci[i];
int duz1=sred-poceci[i];
brx+=max(0,min(duz1,duz+1));
bry+=max(0,min(duz1+1,duz+1));
if (brx>m)break;
}
if (brx<=m && bry>m)
{
poc=sred;
break;
}
else if (brx<m)
{
poc=sred+1;
}
else
{
kraj=sred-1;
}
}

printf("%d\n", poc);
return 0;
}
Resenje 2:
Izaberemo jedan broj kao potencijalno reenje, pa proemo kroz sve intervale i vidimo koliko ukupno brojeva manjih
od njega postoji u svim intervalima (oznaimo taj broj sa s), kao i u koliko intervala se taj na traeni broj javlja
(oznaimo taj broj sa t). Taj na izabrani broj e predstavljati reenje ako je s<M<=s+t. Ako pak izabrani broj ne
predstavlja reenje dalje binarnu pretragu usmeravamo ka veim brojevima ako je M>s+t, odnosno ga manjim
brojevima ako je s>=M.
Alternativno reenje bi moglo da bude da se svaki interval predstavi sa dve strukture koje e predstavljati levi
odnosno desni kraj intervala (svaka struktura sadri brojnu vrednost kraja intervala, kao i informaciju da li to
predstavlja levi ili desni kraj intervala). Zatim se tih 2N struktura sortiraju rastue po brojnoj vrednosti kraja
intervala. Potom se redom prolazei kroz ove strukture trai prvo izmeu koja dva kraja se nalazi traeni broj, a
potom i koju tano vrednost on predstavlja (ovaj deo jako lii na reenje zadatka Drva).
#include <cstdio>
#include <algorithm>
using namespace std;
int starts[1000000];
int ends[1000000];
int main(int argc, char* argv[])
{
int n, m;
scanf("%d%d", &n, &m);
int low = -2000000000;
int high = 2000000000;
for (int i = 0; i < n; i++)
{
scanf("%d", starts+i);
low = min(low, starts[i]);
}
for (int i = 0; i < n; i++)
{
scanf("%d", ends+i);
high = max(high, ends[i]);
}
while (low < high)
{
int mid = (int)floor((low + high) * 0.5);
long long lessCount = 0;
long long nextLessCount = 0;
for (int i = 0; i < n; i++)
{
lessCount += max(0, min(mid - starts[i], ends[i] - starts[i] + 1));
nextLessCount += max(0, min(mid + 1 - starts[i], ends[i] - starts[i] + 1));
}
if (lessCount <= m && nextLessCount > m)
{
low = mid;
break;
}
else if (lessCount < m)
{
low = mid + 1;
}
else

{
high = mid - 1;
}
}
printf("%d", low);
}
8.
Uvod u algoritme / Sloenost algoritama / PARPNIZ
Podnizovi parne sume
Problem
Istorija
Komentari

Status: Reen
Id: PARPNIZ
Izvor: BubbleBee Tim
Tip: Basic
Teina: 1
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 10
Uspenost: 10% (1/10)
Problem Statement
Dat je niz A prirodnih brojeva duzine N. Naci broj podnizova (uzastopni elementi) cija je suma parna.
Input
Prvi red standardnog ulaza sadrzi prirodni broj N koji predstavlja broj elemenata niza. Naredni red sadrzi N prirodnih
brojeva, razdvojenih jednim znakom razmaka, koji predstavljaju elemente niza.
Output
Prvi i jedini red standardnog izlaza sadrzi jedan prirodan broj - broj podnizova parne sume.
Example
Example Input

Example Output

4
1234

Example Description
1 <= N <= 1.000.000
1 <= A [i] <= 1.000
Resenje:
include <stdio.h>
#define MAX 1000000
int n, a[MAX], thisSum, brNeparnih, brParnih;
int main() {
int i;
long long rez;
scanf("%d", &n);
scanf("%d", &a[0]);
thisSum = a[0];

if (a[0]%2) brNeparnih++;
for (i = 1; i < n; i++) {
scanf("%d", a+i);
thisSum += a[i];
if (thisSum%2) brNeparnih++;
}
brParnih = n - brNeparnih + 1;
rez = (long long)brParnih*(brParnih-1)/2 + (long long)brNeparnih*(brNeparnih-1)/2;
printf("%lld", rez);
return 0;
}
9.
Uvod u algoritme / Sloenost algoritama / SUMARUM
Suma podniza karata
Problem
Istorija
Komentari

Status: Reen
Id: SUMARUM
Izvor:Drzavno takmicenje, Srbija, 2010
Tip: Training
Teina: 2
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 256 mb
Broj test sluajeva: 19
Uspenost: 50% (1/2)
Problem Statement
urica je pronaao n karata poreanih u niz. Na kartama su zapisani celi brojevi. Datom nizu karata A, urica
dodeluje vrednost f(A) koja je jednaka sumi razlika vrednosti na uzastopnim kartama. Formalno,
f(A) = (Ak + 1 - Ak), k = 1 .. n - 1
gde Ai predstavlja vrednost na i-toj karti u nizu.
urica iz niza eli da izbaci najvie K karata. Izbacivanjem nekih m karata, m K, dobija nov niz karata kojem
ponovo rauna vrednost na opisani nain. Od svih moguih odabira vrednosti m i svih moguih odabira m karata koje
e izbaciti, njega zanima onaj niz karata koji e imati najveu vrednost. Pomozite urici i recite mu koliko je ta
najvea vrednost. Primetimo da urica ni u jednom momentu ne menja raspored karata datih na poetku.
Input
U prvom redu nalaze se celi brojevi N i K. U narednom redu se uitavaju celi brojevi Ai, odvojeni jednim znakom
razmaka.
Output
U prvom i jedinom redu ispisati jedan ceo broj koji predstavlja najveu vrednost niza koju urica moe da dobije od
poetnog izbacivanjem najvie K karata.
Example
Example Input

Example Output

11 4
17253823655

Example Description
Jedno optimalno reenje je da se izbacimo 3 karte iz niza. Karte koje treba izbaciti imaju na sebi vrednost 5.
Constrains
2 N 500.000
0KN-2
-1.000.000 Ai 1.000.000
Resenje:
#include <iostream>
#include <cstdio>
#include <vector>
#define makro1(_a,_f,_t) for(int _a=(_f),__t=(_t);_a<__t;_a++)
#define FOR(__i, __n) makro1 (__i, 0, __n)
using namespace std;
const int MAX = 500000;
int veci_m[MAX], manji_m[MAX], a[MAX];
int main(){
int n, k, i;
int poc, kraj, rez;
poc=0;
scanf("%d%d", &n, &k);
for (i=0;i<n;i++) scanf("%d", &a[i]);
kraj = n - k - 1;
veci_m[n - 1] = a[n - 1];
for (i = n - 2; i > -1; i--) veci_m[i] = max(a[i], veci_m[i + 1]);
manji_m[0] = a[0];
makro1 (i, 1, n) manji_m[i] = min(a[i], manji_m[i - 1]);
rez = -(1 << 30);
FOR (i, k + 1){
rez = max(rez, veci_m[kraj] - manji_m[poc]);
poc++; kraj++;
}
printf("%d\n", rez);
return 0;
}
10.
Uvod u algoritme / Sloenost algoritama / BUBAM
Bubamara
Problem
Istorija
Komentari
Reenje

Status: Reen

Id: BUBAM
Izvor: Zupanjsko 2007, Hrvatska
Tip: Training
Teina: 2
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 10
Uspenost: 100% (2/2)
Problem Statement
Julijin omiljeni lik iz igrica jeste Super Bubamara, koja pored toga sto moze da leti i da sarmom smeksa protivnika,
poseduje i tehnike razbijanja prepreka. U jednom delu igrice Super Bubamara leti kroz pecinu, oblika tunela, punu
prepreka u vidu stalaktita (vise sa plafona) i stalagmita (izdizu se sa poda). Posto je za zaobilazenje prepreka potrebno
mnogo vise vremena nego za njihovo razbijanje, Julija svoju bubamaru vodi kroz pecinu/tunel tako sto na osnovu
visina prepreka pokusa da odredi visinu na kojoj bubamara treba da leti, a da pri tome naidje na sto manji broj
prepreka (ne bi li izgubila sto manje vremena razbijajuci ih), pa je pusti da do kraja tunela leti ne menjajuci visinu.
Vas zadatak je da napisete program kojim bi se odredilo koliko ima visina na kojima bubamara moze da leti, a da pri
tome naidje na najmanji moguci broj prepreka.
Input
Prva linija ulaza sadrzi dva prirodna broja n, koji predstavlja broj prepreka, ih, koji predstavlja visinu tunela. U
sledecih n liniji se nalazi n celih brojeva koji predstavljaju duzine prepreka od njihovog korena do drugog kraja, pri
cemu se pretpostavlja da je prva prepreka stalagmit, a da se zatim naizmenicno smenjuju stalaktiti i stalagmiti.
Output
Izlaz sadrzi jedan ceo broj koji govori o tome koliko ima visina na kojima bubamara moze da leti, a da pri tome
naidje na najmanji moguci broj prepreka. Napomena: da ne bi odgovor bio beskonacno, visina na kojoj bubamara leti
mora da bude prirodan broj. Ukoliko bubamara leti u visina kraja neke prepreke ona je nece morati da je razbije
(pogledati primer).
Example
Example Input

Example Output

67
1
5
4
4
5
3

Constrains
2 <= n <= 200.000
2 <= h <= 500.000
Bubamara moze letiti na visinama 1, 2, ..., h.
Resenje:
/*
1.formiramo dva niza stalaktit i stalagmit
sa po h clanova
2. nizove koristimo da izracunamo koliko ima stalagmita i koliko ima
stalaktita vecih od neke visine s.
Vremenska slo?enost O(n+h), memorijska O(h).
*/
#include <stdio.h>
#define LIMITh 500000
int main()
{
int n, h, i, moguceVisine;

static int stalaktit[LIMITh+1]={0}, stalagmit[LIMITh+1]={0};


/* potencijalno velika mem. slozenost, koristi data segment */
/*ucitavanje n, h, nizova */
scanf( "%d%d", &n, &h );
for ( i=0; i<n; ++i ) {
int x;
scanf( "%d", &x );
if ( i%2 == 0 )
++stalagmit[x];
else
++stalaktit[x];
}
/* sumiraj stalaktite i stalagmite */
for ( i=h-2; i>0; --i ) {
stalaktit[i] += stalaktit[i+1];
stalagmit[i] += stalagmit[i+1];
}
/* prebroj koliko ima stalaktita i stalagmita ne manjih od neke visine */
moguceVisine = n+1;
for ( i=1; i<=h; ++i ) {
int prepreke = stalagmit[i] + stalaktit[h-i+1];
if ( prepreke < moguceVisine ) {
moguceVisine = prepreke;
}
}
printf( "%d\n", moguceVisine);
return 0;
}
Resenje 2:
Ovaj prelepi problem sa Zupanjskog takmicenja, Hrvatska 2007, moze na jako konstruktivan nacin da ilustruje sta je
to slozenost algoritma. Naivan pristup ovom problemu je sledeci: za svaku mogucu visinu, kojih ima h, prolazimo
redom po svim preprekama i brojimo one na koje bubamara nailazi. Kako za svaku visinu obilazimo sve prepreke,
kojih ima ukupnu n, dobijamo da je slozenost ovog algoritma O(h * n).
Medjutim, ovaj problem mozemo resiti na ekasniji nacin. Ideja je da iskoristimo to sto se po visinama krecemo
redom. Naime, mozemo primetiti sledece: ukoliko na visini k bubamara ne udara u stalagmit A, tada ona nece udarati
u njega ni za bilo koju vecu visinu. Analogno, ukoliko bubamara nailazi na stalaktit B na datoj visina k, tada ce
nailaziti na njega za svaku visinu vecu od k. Ova svojstva mozemo iskoristiti ukoliko na pocetku sortiramo stalaktite i
stalagmite. Pretpostavimo da smo stalagmite ubacili u niz a, a stalaktite u niz b, koje smo zatim sortirali u
neopadajucem poretku. Na pocetku postavicemo dva pokazivaca, i i j tako da i pokazuje na pocetak niza a dok j
pokazuje na kraj niza b. Oni ce u svakom trenutku pokazivati na element pocev od koga bubamara udara u prepreke:
za stalagmite ulevo (u sve vece) a za stalagmite udesno (u sve manje). Kada prelazimo na sledecu visinu, jednostavno
pomeramo ove pokazivace sve dok ne naidjemo na one prepreke na koje bubamara udara. Kako se na ovaj nacin
svaka prepreka obidje najvise jednom (pokazivaci ne mogu ispasti iz opsega niza), slozenost ovog algoritma nakon
sortiranja je linearna. Ukupna slozenost algoritma je O(h + n log n + m log m).
11.
Uvoenje telefona u ulicu
Problem
Istorija
Komentari

Status: Reen
Id: TelefonUlica
Izvor: Unknown
Tip: Training
Teina: 2
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 6
Uspenost: 100% (1/1)
Problem Statement
U naselju ima n zgrada, rasporeenih po pravom putu s jedne strane na jednakim (jedininim) rastojanjima. U
naselje se uvodi telefonska veza. U nizu T od n elemenata, navedeno je koliko prikljuaka treba uvesti u svaku
zgradu. Svaki telefon mora biti vezan sa centralom posebnim provodnikom. Centrala e biti postavljena u neku od
postojeih zgrada. Odrediti kolika je minimalna zbirna duina provodnika od centrale do svih prikljuaka.
Input
U prvom redu broj zgrada n, manji ili jednak milion. U drugom redu n celih nenegativnih brojeva T[i], manjih ili
jednakih 1000, razdvojenih razmakom.
Output
Jedan broj, traena minimalna zbirna duina provodnika.
Example
Example Input

Example Output

6
351624

30

Example Description
Minimalna zbirna duina provodnika se dobija kada se centrala smesti u etvrtu zgradu sleva, a tada je potrebno 33 +
25 + 11 + 12 + 24 = 30 duinskih jedinica provodnika.
Resenje:
#include <stdio.h>
#define MAX 1000000
short prikljucak[MAX];
int main() {
int n, i;
long long rez=0, centralaRazvoj=0, duzProv=0,
ukupnaDuzProvodnika=0;
scanf("%d", &n);
scanf("%hd", &prikljucak[0]);
for (i = 1; i < n; i++)
{
scanf("%hd", &prikljucak[i]);
ukupnaDuzProvodnika += prikljucak[i]*i;
duzProv += prikljucak[i];
}
rez = ukupnaDuzProvodnika;
for (i = 0; i < n; i++)
{
centralaRazvoj += prikljucak[i];
ukupnaDuzProvodnika += centralaRazvoj - duzProv;

duzProv -= prikljucak[i+1];
if (ukupnaDuzProvodnika < rez) rez = ukupnaDuzProvodnika;
}
printf("%lld", rez);
return 0;
}
12.
Uvod u algoritme / Sloenost algoritama / ZbirMaksimuma
Zbir Maksimuma
Problem
Istorija
Komentari
Reenje

Status: Reen
Id: ZbirMaksimuma
Izvor: unknown
Tip: Training
Teina: 3
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 9
Uspenost: 100% (1/1)
Problem Statement
Dat je niz a od n celih brojeva. Neka je max(i, j) = max(a[k]), i k j. Izraunaj sumu ssvih max(i, j), za 1 i j n.
Input
u prvom redu je prirodan broj n, n 1000000, a u drugom redu je n celih brojeva razdvojenih razmakom, svaki po
apsolutnoj vrednosti manji ili jednak 1000000.
Output
Broj s.
Example
Example Input

Example Output

3
513

22

Example Description
Za n = 3, a = {5, 1, 3}, zbir je 5 + 5 + 5 + 1 + 3 + 3 = 22.
Resenje:
#include <cstdio>
using namespace std;
int main()
{
int n, i, j, razlika, *a, *index;
scanf("%d", &n);
a = new int[n];
scanf("%d", &a[0]);
long long int suma1 = a[0], suma2 = a[0];

index = new int[n];


index[0] = 0;
for (j=0, i = 1; i < n; i++)
{
scanf("%d", &a[i]);
while ((j >= 0) && (a[index[j]] < a[i]))
{ if (j>0) razlika =index[j-1]; else razlika=-1;
suma1+=(a[i] - a[index[j]])*(index[j]-razlika);
j--;
}
j++;
index[j] = i;
suma1+= a[i];
suma2+=suma1;
}
printf("%lld", suma2);
delete [] a;
delete [] index;
return 0;
}
Resenje 2:
#include <iostream>
using namespace std;
int main()
{
int n, i, k, m, *a, *ndx;
cin >> n;
a = new int[n];
ndx = new int[n];
cin >> a[0];
long long int s1 = a[0];
long long int s2 = a[0];
k = 0;
ndx[k] = 0;
for (i = 1; i < n; i++)
{
cin >> a[i];
while ((k >= 0) && (a[ndx[k]] < a[i]))
{
m = (k > 0) ? ndx[k-1] : -1;
s1 = s1 + (a[i] - a[ndx[k]])*(ndx[k]-m);
k--;
}
k++;
ndx[k] = i;
s1 += a[i];
s2 +=s1;
}
cout << s2 << endl;
delete [] a;
delete [] ndx;
return 0;
}
13.

Uvod u algoritme / Sloenost algoritama / RuenjeDomina


Ruenje domina
Problem
Istorija
Komentari
Reenje
Status: Reen
Id: RuenjeDomina
Izvor: unknown
Tip: Training
Teina: 2
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 6
Uspenost: 50% (2/4)
Problem Statement
Du prave linije poreano je n uspravnih domina. Sa svaku dominu poznata je njena x koordinata i visina. Kada
domina pada, ona uvek pada na levo ili na desno. Ako je visina domine koja pada vea ili jednaka rastojanju do
sledee domine, sledea domina e takoe pasti, i pri tome u istom smeru. Dozvoljeno je direktno oboriti jednu
dominu, bilo nalevo ili nadesno. Koliko najvie domina se moe ukupno oboriti na taj nain?
Input
U prvom redu je broj n, n 1000000.
U drugom redu je n realnih brojeva koji redom sleva na desno predstavljaju x koordinate datih domina.
U treem redu je n pozitivnih realnih brojeva, koji u istom redosledu predstavljaju visine domina.
Output
Samo jedan broj ceo, broj domina koje je mogue oboriti direktnim ruenjem jedne domine.
Example
Example Input

Example Output

6
0.3 2.3 4.3 7.3 10.3 12.3
1.0 2.0 3.0 3.0 2.0 1.0
5
Example Description
Ruenjem domine na koordinati 2.3 na desno moe se oboriti ukupno 5 domina.
Resenje 1:
include <math.h>
#define MAX 1000001
#define e 0.00001
double x[MAX], visina[MAX], razlika;
int main() {
int i, n, br=0, maxOboreno=0, pom;
scanf("%d", &n);
for (i = 0; i < n; i++) scanf("%lf", &x[i]);
for (i = 0; i < n; i++) scanf("%lf", &visina[i]);
razlika = x[0]+visina[0]; br = 1;
for (i = 1; i < n; i++)
{
if ( (x[i] < razlika) || (fabs(x[i]-razlika) < e))
{
br++;
//pom=x[i] + visina[i];
if ( (x[i] + visina[i]) > razlika)

razlika = x[i] + visina[i];


}
else
{
if (br > maxOboreno) maxOboreno = br;
br = 1;
razlika = x[i] + visina[i];
}
}
if (br > maxOboreno) maxOboreno = br;
razlika = x[n-1]-visina[n-1];
br = 1;
for (i = n-2; i >= 0; i--)
{
if ( (x[i] > razlika) || (fabs(x[i]-razlika) < e)) {
br++;
//pom=x[i] - visina[i];
if (x[i] - visina[i] < razlika)
razlika = x[i] - visina[i];
}
else {
if (br > maxOboreno) maxOboreno = br;
br = 1;
razlika = x[i] - visina[i];
}
}
if (br > maxOboreno) maxOboreno = br;
printf("%d", maxOboreno);
return 0;
}
Resenje 2:
#include<stdio.h>
#include<stdlib.h>
int main(){
long broj_domina, i;
double *koordinate, *visina;
//ucitavanje podataka
scanf("%ld",&broj_domina);
koordinate = (double* )malloc(sizeof(double)*(broj_domina+1));
visina = (double* )malloc(sizeof(double)*(broj_domina+1));
for (i=0;i<broj_domina;i++)
scanf("%lf", &koordinate[i]);
for (i=0;i<broj_domina;i++)
scanf("%lf", &visina[i]);
long max_rez=0;

//rezultat programa

long rez=0;
//tekuci rezultat
double max_pad=koordinate[0];//koliko maksimalno pada neka od domina (pocetna vrednost je ovakva da bi
prva domina pala)
double pad;
//pad tekuce domine
//za resavanje koristimo dinamicko programiranje, redom prolazimo kroz domine i za svaku pamtimo do koje
koordinate ona pada i azuriramo max_pada
//prvo idemo udesno
for (i=0;i<broj_domina;i++)
if (max_pad>=koordinate[i]){
rez+=1;
if (rez>max_rez)
max_rez=rez;
pad = koordinate[i] + visina[i];
if (pad>max_pad)
max_pad=pad;
}else{
rez=1;
max_pad=koordinate[i] + visina[i];
}
//drugi smer rusenja domina je analogan - ulevo
rez=0;
//tekuci rezultat
max_pad=koordinate[broj_domina-1];//koliko maksimalno pada neka od domina (pocetna vrednost je ovakva
da bi poslednj domina pala)
for (i=broj_domina-1;i>=0;i--)
if (max_pad<=koordinate[i]){
rez+=1;
if (rez>max_rez)
max_rez=rez;
pad = koordinate[i] - visina[i];
if (pad<max_pad)
max_pad=pad;
}else{
rez=1;
max_pad=koordinate[i] - visina[i];
}
printf("%ld",max_rez);
free(koordinate);
free(visina);
return 0;
}
Resenje 3:
#include <stdio.h>
int main()
{
int n, i, maxFallen, fallen;
double *x, *h, reached;
scanf("%d", &n);
x = new double[n];
h = new double[n];
for (i = 0; i < n; i++)
{

scanf("%lf", &x[i]);
}
for (i = 0; i < n; i++)
{
scanf("%lf", &h[i]);
}
maxFallen = 1;
// Sleva na desno
fallen = 0;
reached = x[0]-1.0;
for (i = 0; i < n; i++)
{
if (reached >= x[i])
{
fallen++;
if (maxFallen < fallen)
{
maxFallen = fallen;
}
if (reached < x[i] + h[i])
{
reached = x[i] + h[i];
}
}
else
{
fallen = 1;
reached = x[i] + h[i];
}
}
// Sdesna na levo
fallen = 0;
reached = x[n-1]+1.0;
for (i = n-1; i >=0; i--)
{
if (reached <= x[i])
{
fallen++;
if (maxFallen < fallen)
{
maxFallen = fallen;
}
if (reached > x[i] - h[i])
{
reached = x[i] - h[i];
}
}
else
{
fallen = 1;
reached = x[i] - h[i];
}
}
printf("%d\n",maxFallen);
delete [] x;

delete [] h;
return 0;
}
14.
Uvod u algoritme / Sloenost algoritama / KutijeHodnik
Dodavanje kutija u hodniku
Problem
Istorija
Komentari
Reenje

Status: Reen
Id: KutijeHodnik
Izvor: unknown
Tip: Training
Teina: 2
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 7
Uspenost: 100% (1/1)
Problem Statement
Jednake kutije su poreane u n stubaca du dugakog hodnika. Raspored kutija je zadat nizom aod n celih brojeva,
gde elementi niza predstavljaju visine stubaca (broj kutija u svakom stupcu redom). Koliko se kutija moe dodati na
postojee stupce, tako da se nove kutije ne vide ni sa jedne strane hodnika. Dodata kutija se nee videti ako sa obe
njene strane postoji kutija na istoj visini.
Input
U prvom redu prirodan broj n, n 1000000.
U drugom redu n prirodnih brojeva manjih ili jednakih 1000, koji predstavljaju visine stubaca.
Output
Samo jedan broj, broj kutija koje je mogue dodati a da se ne vide.
Example
Example Input

Example Output

6
314215

Example Description
U drugi i etvrti stubac mogu se dodati po dve kutije , a u peti stubac tri kutije.
Resenje:
#include<stdio.h>
#define MAX 1000000
int stubac[MAX];
int main()
{ int n,i,suma=0,levo, desno, maxInd=0,max=0;
scanf ("%d",&n);
for (i=0;i<n;i++)
{
scanf ("%d",&stubac[i]);
if (stubac[i]>max) //najveca dopuna kutija
{
max=stubac[i];

maxInd=i;
}
}
levo=stubac[0]; //obrada levo od najveceg
for (i=1;i<maxInd;i++)
{
if (levo>stubac[i])
suma+=levo-stubac[i];
else
levo=stubac[i];
}
desno=stubac[n-1]; //obrada desno od najveceg
for (i=n-1;i>maxInd;i--)
{
if (desno>stubac[i])
suma+=desno-stubac[i];
else
desno=stubac[i];
}
printf("%d",suma);
return 0;
}
Resenje 2:
#include <stdio.h>
int main()
{
int n, i, *a, lowerMax, *leftMax;
scanf("%d", &n);
a = new int[n];
leftMax = new int[n];
for (i = 0; i < n; ++i)
scanf("%d", &a[i]);
leftMax[0] = a[0];
for (i = 1; i < n; ++i)
leftMax[i] = (leftMax[i-1] > a[i]) ? leftMax[i-1] : a[i];
long s = 0;
int rightMax = a[n-1];
for (i = n-2; i > 0; --i)
{
lowerMax = (leftMax[i-1] < rightMax) ? leftMax[i-1] : rightMax;
s += (lowerMax > a[i]) ? lowerMax - a[i] : 0;
rightMax = (rightMax > a[i]) ? rightMax : a[i];
}
printf("%d\n", s);
delete [] a;
delete [] leftMax;
return 0;
}
15.
Uvod u algoritme / Sloenost algoritama / NapredovanjeRobota
Napredovanje robota

Problem
Istorija
Komentari
Reenje

Status: Reen
Id: NapredovanjeRobota
Izvor: unknown
Tip: Training
Teina: 3
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 10
Uspenost: 100% (1/1)
Problem Statement
Na pravoj liniji nalazi se n polja. Na nekim od tih polja se nalazi po jedan robot, dok su ostala polja prazna. U
svakom vremenskom koraku, svaki robot se ponaa prema sledeem pravilu:
Ako sledee (na desno) polje postoji i prazno je, prei na njega;
Inae, ostani na svom mestu.
Koliko vremenskih korka je potrebno da svi roboti odu na desno koliko god je mogue?
Input
U prvom redu nalazi se broj n, n 1000000. U drugom redu je n brojeva razdvojenih razmakom, od kojih su svi nule
ili jedinice. Nule odgovoaraju praznim poljima, a jedinice poljima na kojima se nalazi robot.
Output
Samo jedan broj, traeni broj vremenskih koraka.
Example
Example Input

Example Output

7
1001110

Example Description
Evo kako izgleda niz polja nakon svakog od 4 vremenska koraka:
Inicijalno:
1001110
Posle prvog koraka:
0101101
Posle drugog koraka:
0011011
Posle treeg koraka:
0010111
Posle etvrtog koraka: 0 0 0 1 1 1 1
Resenje:
#include <cstdio>
#define MAX 1000001
short robot[MAX];
int main() {
int i,n,sl;
scanf("%d", &n);
for (i=0;i<n;i++)
scanf("%hd",&robot[i]);
int max=0,brjedinica=0;
for (sl=n-1,i=n-1;i>-1;i--)
if (robot[i]) {
max=sl-i;

sl--;
if (max>brjedinica) brjedinica=max;
else brjedinica++;
}
if (brjedinica<n)printf("%d",brjedinica);
else printf("0");
return 0;
}
Resenje 2:
#include <stdio.h>
int TimeToFinish(const int *r, int n)
{
int emptyCnt = 0;
int steps = 0;
for(int i = n-1; i>=0; --i)
{
if(r[i])
steps = (emptyCnt > steps) ? emptyCnt :
((steps > 0) ? steps + 1 : 0);
else
++emptyCnt;
}
return steps;
}
int main()
{
int n, i, *robots;
scanf("%d", &n);
robots = new int[n];
for (i = 0; i < n; ++i)
scanf("%d", &robots[i]);
printf("%d\n", TimeToFinish(robots, n));
delete [] robots;
return 0;
}
16.
Uvod u algoritme / Sloenost algoritama / PadanjeMrava
Padanje mrava
Problem
Istorija
Komentari
Reenje

Status: Reen
Id: PadanjeMrava
Izvor: unknown

Tip: Training
Teina: 3
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 6
Uspenost: 50% (1/2)
Problem Statement
Na intervalu [0, L] nalazi se n mrava. Neki od njih gledaju na levo, a neki na desno. U trenutku t0 = 0, svi mravi
poinju da se kreu u smeru u kome gledaju. Kada se dva mrava sretnu, oba se okreu bez gubljenja vremena i
nastavljaju da se kreu u smeru suprotnom od dotadanjeg. Mrav koji naie na jedan od krajeva intervala, pada sa
njega. Odrediti vreme t i indeks k(brojei od 1) mrava koji poslednji pada sa datog intervala.
Input
U prvom redu realan broj L i prirodan broj n, n 1000000.
U drugom redu n realnih brojeva razdvojenih razmakom, koji predstavljaju redom (sleva na desno)
poetne koordinate mrava.
U treem redu niz od n brojeva jednakih 0 ili 1, koji u istom redosledu predstavljaju poetne orijentacije mrava.
Jedinice odgovaraju mravima okrenutim nalevo, a nule na desno.
Output
Realan broj t na tri decimale i prirodan broj k (razdvojeni razmakom), kao to je opisano u tekstu.
Example
Example Input

Example Output

10.0 5
2.0 4.0 5.0 7.0 8.0
10010

7.0 2

Resenje:
#include <cstdio>
#define NMAX 1000000
double a[NMAX];
short kretanje[NMAX]; //0 ili 1
int main() {
int n, i, nalevo=0, pozicija;
double L, udaljen, vrememax=0;
scanf("%lf%d", &L, &n);
for (i=0;i<n;i++) scanf("%lf", &a[i]);
for (i=0; i<n; i++) {
scanf("%hd", &kretanje[i]);
nalevo+=kretanje[i];
if (!kretanje[i]) udaljen = L-a[i];
else udaljen=a[i];
if (vrememax <udaljen)
{ vrememax=udaljen;
pozicija=i; //mrav koji je poslednji pao
}
}
pozicija = nalevo + (1 - kretanje[pozicija]);
printf("%0.3lf ", vrememax);
printf("%d\n", pozicija);

return 0;
}
Resenje 2:
#include <stdio.h>
int main()
{
double L, t, tmax, *x;
int n, i, imax, leftCnt, *left;
scanf("%lf %d", &L, &n);
x = new double[n];
left = new int[n];
for (i = 0; i < n; i++) scanf("%lf", &x[i]);
for (i = 0; i < n; i++) scanf("%d", &left[i]);
tmax = 0;
leftCnt = 0;
for (i = 0; i < n; i++)
{
leftCnt += left[i];
t = left[i] ? x[i] : L - x[i];
if (tmax < t)
{
tmax = t;
imax = i;
}
}
// Ako mrav koji poslednji pada - pada nalevo, njegov indeks je leftCnt, inace je leftCnt+1.
imax = leftCnt + (1 - left[imax]);
printf("%0.3f %d\n", tmax, imax);
delete [] x;
delete [] left;
return 0;
}
17.
Uvod u algoritme / Sloenost algoritama / GranicaZbirPara
Najmanje gornje ogranienje zbira parova
Problem
Istorija
Komentari

Status: Reen
Id: GranicaZbirPara
Izvor: nepoznat
Tip: Training
Teina: 1
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 7
Uspenost: 100% (1/1)

Problem Statement
Dat je niz od 2N brojeva. Nai najmanji broj x, takav da je mogue od ulaznog niza formirati ntakvih parova, da je
zbir svakog para manji ili jednak x.
Input
U prvom redu je prirodan broj n, n1000000. U drugom redu 2n realnih brojeva razdvojenih razmakom.
Output
Traeni broj x na 5 decimala.
Example
Example Input

Example Output

3
256814

Resenje:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define NMAX 2000002
double a[NMAX];
int main()
{
int n;
double pom;
scanf("%d",&n);
for (int i=0;i<2*n;i++) scanf("%lf",&a[i]);
sort(a,a+2*n);
double x=a[0]+a[2*n-1];
for (int i=1;i<n;i++)
{ pom=a[i]+a[2*n-1-i];
if (pom>x) x=pom;
}
printf("%.5lf\n",x);
return 0;
}
18.
Uvod u algoritme / Sloenost algoritama / SmusenostNizova
Smuenost nizova
Problem
Istorija
Komentari
Reenje

Status: Reen
Id: SmusenostNizova
Izvor:Hrvatski savez informatiara, upanijsko 2009

Tip: Training
Teina: 0
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 9
Uspenost: 16.67% (1/6)
Problem Statement
Zapisana su 2 niza jednake duine N. Smuenost tih nizova raunamo tako to prvo brojevima u drugom nizu
obrnemo poredak, a zatim saberemo proizvode brojeva na jednakim pozicijama u nizovima.
3 -4 -3 -2 2 0
-3 0 5 -1 3 2
Na primer, smuenost gore navedena 2 niza iznosi 32 + (4)3 + (3)(1) + (2)5 + 20 + 0(3) = 13.
Napisati program koji e pronai brojeve P i K, takve da nakon brisanja P brojeva (mogue ni jednog broja) sa
poetka oba niza i K brojeva (mogue ni jednog broja) sa kraja oba niza, smuenost dobijenih nizova bude to je
mogue vea.
Kao rezultat, potrebno je ispisati smuenost dobijenih nizova.
Input
U prvom redu nalazi se celi broj N (1 N 2000) koji predstavlja duinu niza.
U drugom redu ulaza nalazi se N celih brojeva odvojenih po jednim razmakom, koji predstvaljaju prvi niz.
U treem redu ulaza nalazi se N celih brojeva odvojenih po jednim razmakom, koji predstavljaju drugi niz.
Brojevi u oba niza bie po apsolutnoj vrednosti manji od 1000.
Output
U prvom i jedinom redu ispisati maksimalnu smuenost nizova dobijenih izbacivanjem P brojeva sa poetka i K
brojeva sa kraja nizova.
Example
Example Input

Example Output

6
3 -4 -3 -2 2 0
-3 0 5 -1 3 2

24

Example Description
p=0, k=3
Constrains
1 N 2000, 0 P, K < N, P+K < N
Resenje:
#include <cmath>
#include <cstdio>
#define MAX 2000
int n, p, k;
int a[MAX], b[MAX];
int max_smusenost = -2000000000;
int main()
{ int i,l,r;
double middle;
scanf("%d",&n);
for(i = 0; i < n; ++i) scanf("%d",&a[i]);
for(i = 0; i < n; ++i) scanf("%d",&b[i]);
for(middle=0.0; middle <= n-1; middle += 0.5 ) {
l = (int)floor( middle );
r = (int)ceil( middle );
int smusenost = 0;
if(l == r) smusenost=-a[l]*b[r];
do {
smusenost+=a[l]*b[r]+a[r]*b[l];
if(smusenost>max_smusenost) {
max_smusenost = smusenost;

p=l;
k=n-r-1;
}
--l;++r;
} while( l >= 0 && r < n );
}
//printf("%d %d\n",p,k);
printf("%d\n",max_smusenost);
return 0;
}
19.
Uvod u algoritme / Sloenost algoritama / PALNIZ
Palindromski niz
Problem
Istorija
Komentari

Status: Reen
Id: PALNIZ
Izvor: Okruzno takmicenja, 2010
Tip: Training
Teina: 0
Vremensko ogranienje: 0.5 s
Memorijsko ogranienje: 256 mb
Broj test sluajeva: 10
Uspenost: 25% (1/4)
Problem Statement
Niz brojeva je palindromski, ako se ita isto i sa leve i sa desne strane. Na primer, nizovi {1, 5, 1} i {10, 9, 9, 10} su
palindromski, dok {1, 2, 3, 1} i {20, 2} nisu palindromski.
Na poetku je dat niz prirodnih brojeva a duine n. U jednom koraku dozvoljeno je zameniti dva susedna broja
njihovom sumom (obrisati dva susedna broja a[i] i a[i + 1] i na njihovom mestu upisati a[i] + a[i + 1]). Odrediti
najveu moguu duinu palindromskog niza, koji se moe dobiti primenom ove operacije proizvoljan broj puta.
Input
U prvom redu se nalazi prirodan broj n. U drugom redu se nalaze n prirodnih brojeva a[i], koji predstavljaju elemente
niza a.
Output
U prvom i jedinom redu ispisati jedan prirodan broj koji predstavlja najveu duinu palindromskog niza koji se moe
dobiti od polaznog niza.
Example
Example Input

Example Output

6
10 10 10 20 20 30

Example Description
Zamenimo prva dva broja i dobijamo niz {20, 10, 20, 20, 30}. Zatim menjamo opet prva dva broja i dobijamo
palindromski niz {30, 20, 20, 30} duine etiri.
Constrains
1 n 100.000
1 a[i] 10.000
Resenje:
#include <stdio.h>
#define MAX 1000000

int a[MAX];
int main()
{int n,i,j,br=0;
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d",&a[i]);
for (i=0, j=n-1;i<j;)
{ if(a[i]>a[j]){a[j-1]+=a[j]; j--;}
else if(a[j]>a[i]){a[i+1]+=a[i]; i++;}
else {br+=2; j--; i++;}
}
if(i==j)br++;
printf("%d",br);
return 0;
}
20.
Uvod u algoritme / Sloenost algoritama / VIKEND
Vikendica
Problem
Istorija
Komentari

Status: Reen
Id: VIKEND
Izvor:Drzavno takmicenje, Srbija, 2007
Tip: Master
Teina: 3
Vremensko ogranienje: 0.5 s
Memorijsko ogranienje: 256 mb
Broj test sluajeva: 20
Uspenost: 100% (1/1)
Problem Statement
Draganetu je dosadilo da ivi u gradu pa je reio da sagradi sebi vikendicu, u kojoj e u miru i tiini moi da
sprovodi svoje programerske ideje. Kako je Dragane veoma vredan, reio je da sam napravi nacrte njegove kue iz
snova. No, na poetku je trebalo da odredi mesto na kome e se graditi. Kako Dragane nije ba bogat (matematika i
programiranje nije bilo isplativo kako je on mislio), odredio je maksimalni budet koji moe da potroi za kupovinu
placeva. Naravno, eli da vikendica bude to lepa, pa je odredio i donju granicu budeta. Sad je u nedoumici gde da
je sagradi. Pomozite Draganetu da odredi broj moguih mesta za gradnju vikendice.
Mesta na kojima Dragane moe da gradi vikendicu data su u obliku pravougane matrice, gde polja predstavljaju
placeve. Za svaki plac je data njegova cena. Vikendica je u obliku pravougaonika. Na pravougaoniku se moe
sagraditi vikendica ukoliko suma njenih parcela upada u granice budeta.
Input
U prvom redu se nalaze etiri broja: n, m, A i B, koji predstavljaju broj vrsta i kolona matrice, donju granicu i gornju
granicu budeta. U narednih n redova nalazi se po m nenegativnih celih brojeva koji predstavljaju cene placeva.
Output
U prvom i jedinom redu tampati broj moguih pozicija vikendice.
Example
Example Input

Example Output

3323
100
010
001

Example Description
Mogue pozicije za vikendicu (predstavljene sa 'o') su sledee:
oox ooo oox xxx xoo xxx ooo
oox ooo oox xoo xoo ooo ooo
xxx xxx oox xoo xoo ooo ooo
Suma elemenata u oznaenim pravougaonicima je u opsegu [2,3].
Constrains
1 n, m 150
0 A B 10^9
cene placeva su u opsegu [0, 10^4]
broj reenja ne prelazi 2^30
ukupna suma cena svih placeva je manja od 2^30
Resenje:
Jelena Hadzi-Puric
Odjavi se
Poetna
O nama
Kursevi
Vesti
Profil
Kontakt
Uvod u algoritme / Sloenost algoritama / VIKEND
Vikendica ProblemIstorijaKomentari
Status: Reen
Id: VIKEND
Izvor: Drzavno takmicenje, Srbija, 2007
Tip: Master
Teina: 3
Vremensko ogranienje: 0.5 s
Memorijsko ogranienje: 256 mb
Broj test sluajeva: 20
Uspenost: 100% (1/1)
Istorija
Datum Status Jezik Kod
10/5/2013 10:24:51 PM
Succeeded C/C++ Kod
Sponsored by Dobrodoli, Jelena Hadzi-Puric | Odjavi se
select allx
#include <stdio.h>
#define DIM 151
int n, m, A, B, plac[DIM][DIM],pom;
int SaberiPolja(int a1, int b1, int a2, int b2)
//suma cena polja u pravogaoniku sa glavnom dijagonalom (a1,b1), (a2,b2) */
{
return (plac[a1-1][b1-1]+plac[a2][b2]-plac[a1-1][b2]-plac[a2][b1-1]);
}
int Prebroj(int Granica)
{ int i,j,p, r,brPravougaonika=0;
for(i=1;i<n+1;i++)
for(j=1;j<m+1;j++)
for (r=1,p=i;p>0;p--)
{
while (SaberiPolja(p,r,i,j)>Granica &&(r<j+1)) r++;
if (r>j) break;
brPravougaonika+=(j-r+1);

}
return brPravougaonika;
}
int main ()
{
int i, j, polje, brPravougaonika;
scanf ("%d%d%d%d",&n,&m,&A,&B);
for(i=1;i<n+1;i++)
for(j=1;j<m+1;j++)
{
scanf ("%d", &polje);
plac[i][j]=(plac[i-1][j]+plac[i][j-1]-plac[i-1][j-1]) + polje;
}
brPravougaonika=Prebroj(B)-Prebroj(A-1);
printf ("%d\n",brPravougaonika);
return 0;
}
21.
Uvod u algoritme / Sloenost algoritama / BC3NSUB
Lepi podnizovi

Problem
Istorija
Komentari

Status: Reen
Id: BC3NSUB
Izvor: BubbleCup 2010
Tip: Master
Teina: 3
Vremensko ogranienje: 0.5 s
Memorijsko ogranienje: 64 mb
Broj test sluajeva: 4
Uspenost: 100% (1/1)

Problem Statement
Dat je niz A duine N. Za podniz (a[i], a[i+1],..., a [j]) = a [i, j], gde je
i < j, kaemo da je lep ukoliko vai:

a [i] <= a [j]

a [i] <= a [k] <= a [j], za svako k iz [i, j]

Napisati program koji nalazi najdui lepi podniz za dati niz prirodnih
brojeva.
Input
U prvom redu ulaza se nalazi prirodni broj N koji predstavlja duinu niza. U
narednih N redova se nalazi po jedan prirodan broj - elementi datog niza.
Output
U prvom i jedinom redu tampati duinu najdueg lepog podniza.
Example
Example Input

Example Output

6
1
3
4
2
5
0

Constrains

2 <= N <= 10^6

0 <= a [i] <= 2 * 10^9, za i iz [1, n]

Resenje:
#include <iostream>
#include <stack>
using namespace std;
typedef struct {
int ind;
int minInd;
}Podniz;
void testiraj(stack<Podniz*> &stek, int* niz, int &maxDuzina)
{ Podniz *pom, *tek;
int temp;
tek = stek.top();
stek.pop();
temp=tek->ind - tek->minInd + 1;
if(tek->ind != tek->minInd && maxDuzina < temp)
maxDuzina = temp;
if(stek.size() != 0) {

pom = stek.top();
if(niz[tek->minInd] <= niz[pom->minInd])
pom->minInd = tek->minInd;
}
delete tek;
}
int main()
{ int n, i;
cin >> n;
if(n < 2) {
cout << -1 <<endl;
return 0;
}
int* niz = new int[n];
for(i = 0; i < n; i++) cin >> niz[i];
// testiraj da li je niz monotono opadajuci
for(i = 0; i < n - 1; i++)
{ if(niz[i] <= niz[i + 1]) break; }
if(i == n - 1)
{ cout << -1 <<endl;

delete [] niz;

return 0; }

stack<Podniz*> stek;
Podniz *tek;
int maxDuzina = 0;
for(i = n - 1; i >= 0; i--)
{
while(stek.size() != 0 && niz[i] > niz[stek.top()->ind])
{ testiraj(stek, niz, maxDuzina); }
tek = new Podniz();
tek->ind = i;
tek->minInd = i; stek.push(tek);
}
while(stek.size() != 0)
testiraj(stek, niz, maxDuzina);
cout<< maxDuzina <<endl;
delete [] niz;
return 0;
}
22.
Uvod u algoritme / Napredni algoritmi sortiranja / Sort

Sortiraj

Problem
Istorija
Komentari

Status: Reen
Id: Sort
Izvor: N/A
Tip: Basic
Teina: 0
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 10
Uspenost: 100% (1/1)

Problem Statement
Dat je niz celih brojeva A. Potrebno je ispisati elemente niza A u neopadajucem redosledu.

Input
Prvi red standardnog ulaza sadrzi prirodan broj N (1 <= N <= 100 000) koji predstavlja broj
elemenata niza. Naredni red sadrzi N prirodnih brojeva, razdvojenih jednim znakom razmaka,
koji predstavljaju elemente niza. (-10^9 <= A[i] <= 10^9)

Output
U prvom redu standardnog izlaza potrebno je ispisati elemente niza A u neopadajucem redosledu.

Example
Example Input

Example Output

5
1 -1 50 92 -55

Resenje:
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define NMAX 100000
int main()
{

-55 -1 1 50 92

int n,a[NMAX],i;
scanf ("%d",&n);
for (i=0;i<n;i++)
scanf ("%d",&a[i]);
sort (a,a+n);
for (i=0;i<n;i++)
printf ("%d ",a[i]);
}
23.
Uvod u algoritme / Napredni algoritmi sortiranja / SortStbl

Sortiraj Stabilno

Problem
Istorija
Komentari

Status: Reen
Id: SortStbl
Izvor: N/A
Tip: Basic
Teina: 0
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 10
Uspenost: 100% (1/1)

Problem Statement
Dat je niz parova celih brojeva <A[i], B[i]>. Kazemo da je par <A[i], B[i]> manji od <A[j],
B[j]> ukoliko vazi jedan od sledeca dva uslova:
1. A[i] < A[j]
2. A[i] = A[j], i < j

Mozemo primetiti da ne postoje dva elemente u nizu koja su jednaka. Vas zadatak je da ispisete
ovaj niz parova celih brojeva u rastucem redosledu.

Input
Prvi red standardnog ulaza sadrzi prirodan broj N (1 <= N <= 100 000) koji predstavlja broj
elemenata niza A i B. Drugi red sadrzi N prirodnih brojeva, razdvojenih jednim znakom razmaka,
koji predstavljaju elemente niza A. Naredni red sadrzi N prirodnih brojeva, razdvojenih jednim
znakom razmaka, koji predstavljaju elemente niza B. (-10^9 <= A[i], B[i] <= 10^9)

Output
U prvi red standarnog izlaza ispisati niz A posle sortiranja. U sledeci red ispisati niz B
posle sortiranja.

Example
Example Input

Example Output

5
1 -1 1 92 -55

-55 -1 1 1 92

4 5 1 -1 2

2 5 4 1 -1

Resenje:
#include <cstdio>
#include <algorithm>
#define MAXN 100000
using namespace std;
struct s {
int a, b;
} niz[MAXN];
bool cmp(s x, s y) {
return x.a < y.a;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) scanf("%d", &niz[i].a);
for (int i = 0; i < n; i++) scanf("%d", &niz[i].b);
stable_sort(niz, niz+n, cmp);
for (int i = 0; i < n-1; i++) printf("%d ", niz[i].a);
printf("%d\n", niz[n-1].a);
for (int i = 0; i < n; i++) printf("%d ", niz[i].b);
return 0;
}
24.
Uvod u algoritme / Napredni algoritmi sortiranja / IzbaciDuplikate

Izbaci Duplikate

Problem
Istorija
Komentari

Status: Reen
Id: IzbaciDuplikate
Izvor: N/A
Tip: Basic
Teina: 0
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 10
Uspenost: 100% (1/1)

Problem Statement
Dat je niz celih brojeva A. Potrebno je iz niza A izbaciti duplikate. Preciznije, od svakog
broja x, koji se pojavljuje vise od jednom u nizu A, potrebno je ostaviti samo jedan primerak.
Ispisati elemente niza A posle izbacivanja duplikata u neopadajucem redosledu.

Input
Prvi red standardnog ulaza sadrzi prirodan broj N (1 <= N <= 100 000) koji predstavlja broj
elemenata niza. Naredni red sadrzi N prirodnih brojeva, razdvojenih jednim znakom razmaka,
koji predstavljaju elemente niza. (-10^9 <= A[i] <= 10^9)

Output
U prvom redu standardnog izlaza potrebno je ispisati broj elemenata niza A posle izbacivanja
duplikata. U sledecem redu ispisati elemente niza A posle izbacivanja u neopadajucem
redosledu.

Example
Example Input

Example Output

1 -1 1 92 -1

-1 1 92

Resenje:
#include <stdio.h>
#include <algorithm>
using namespace std;
#define NMAX 1000000
int a[NMAX];
int main()
{
int n,i,k=1;
scanf("%d",&n);
for(i=0;i<n;i++)scanf("%d",&a[i]);

sort(a,n+a);
for(i=1;i<n;i++)if(a[i]!=a[i-1])a[k++]=a[i];
printf("%d\n",k);
for(i=0;i<k;i++)printf("%d ",a[i]);
return 0;
}
25.
Uvod u algoritme / Napredni algoritmi sortiranja / SpojiNizove

Spoji Nizove

Problem
Istorija
Komentari

Status: Reen
Id: SpojiNizove
Izvor: N/A
Tip: Basic
Teina: 0
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 8
Uspenost: 100% (1/1)

Problem Statement
Data su 3 niza celih brojeva A, B, C. Elementi u sva tri niza su dati u neopadajucem poretku.
Ispisati niz koji sadrzi sve elemente ova tri niza, gde su svi elementi poredjani u
neopadajuci poredak.

Input
Prvi red standardnog ulaza sadrzi tri prirodna broja Na, Nb, Nc (1 <= Na, Nb, Nc, Na + Nb + Nc
<= 1 000 000) koji predstavljaju brojeve elemenata niza A, B, C, redom. Naredni red sadrzi Na
prirodnih brojeva, razdvojenih jednim znakom razmaka, koji predstavljaju elemente niza A. (10^9 <= A[i] <= 10^9)
Sledeci red sadrzi Nb prirodnih brojeva, razdvojenih jednim znakom razmaka, koji predstavljaju
elemente niza B. (-10^9 <= B[i] <= 10^9)
Poslednji red sadrzi Nc prirodnih brojeva, razdvojenih jednim znakom razmaka, koji
predstavljaju elemente niza C. (-10^9 <= C[i] <= 10^9)

Output

U prvom redu standardnog izlaza potrebno je ispisati elemente nizova A, B, C u neopadajucem


redosledu.

Example
Example Input

Example Output

2 4 3
1 1
2 4 5 6
3 3 8

1 1 2 3 3 4 5 6 8

Resenje:
#include <stdio.h>
#include <algorithm>
using namespace std;
long int niz[1000000];
int main()
{
int i,na,nb,nc;
scanf("%d%d%d",&na,&nb,&nc);
for(i=0;i<na;i++)
scanf("%ld",&niz[i]);
for(i=0;i<nb;i++)
scanf("%ld",&niz[i+na]);
for(i=0;i<nc;i++)
scanf("%ld",&niz[i+na+nb]);
sort(niz,niz+na+nb+nc);
for(i=0;i<na+nb+nc;i++)
printf("%ld ",niz[i]);
return 0;
}
26.
Uvod u algoritme / Napredni algoritmi sortiranja / NajmanjiBrojevi

Najmanji Brojevi

Problem
Istorija
Komentari

Status: Reen
Id: NajmanjiBrojevi
Izvor: N/A
Tip: Training

Teina: 0
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 1000 mb
Broj test sluajeva: 10
Uspenost: 100% (1/1)

Problem Statement
Dat je niz celih brojeva A. Potrebno je ispisati najmanjih K elemenata ovog niza u
neopadajucem redosledu.

Input
Prvi red standardnog ulaza sadrzi prirodne brojeve N i K (1 <= K <= N <= 1 000 000) koji
predstavljaju broj elemenata koje treba ispisati i broj elemenata niza A, redom. Naredni red
sadrzi N prirodnih brojeva, razdvojenih jednim znakom razmaka, koji predstavljaju elemente
niza. (-10^9 <= A[i] <= 10^9)

Output
U prvom redu standardnog izlaza potrebno je ispisati najmanjih K elemenata niza A u
neopadajucem redosledu.

Example
Example Input

Example Output

6
9 1 -2 -5 0 0

-5 -2 0

Resenje:
#include <cstdio>
#include <algorithm>
using namespace std;
#define NMAX 1000000
int a[NMAX];
int main() {
int n, k;
scanf("%d%d", &n, &k);
for (int i = 0; i < n; i++) scanf("%d", &a[i]);
sort(a, a+n);
for (int i = 0; i < k; i++) printf("%d ", a[i]);
return 0;
}
27. http://takprog.dms.rs/takmicenja/2011.0.kv2/4.faktorisanje/task.html
Uvod u algoritme / Matematiki algoritmi 1 / FACT1
Status: Reen
Id: FACT1

Izvor: Kvalifikacije II 2011


Tip: Basic
Teina: 1
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 128 mb
Broj test sluajeva: 10
Uspenost: 0% (0/0)

Problem Statement
Dato je n brojeva. Potrebno je faktorisati svaki broj, tj. napisati ga kao proizvod prostih inilaca. Svaki broj faktorisati
u formatu p1^a1 * p2^a2 * ... * pk^ak , gde su p1 p2 ... pk svi prosti inioci datog broja (u rastuem redosledu), a a1,
a2, ..., ak - njihovi odgovarajui izloioci. Izmedju brojeva i simbola '*' i '^' ne sme biti razmaka. Takoe, ukoliko je
izloilac nekog broja jednak 1, treba ga svejedno ispisati.
Input
U prvom redu standradnog ulaza nalazi se prirodan broj n . U sledeih n redova se nalazi po jedan ceo broj bi koga
treba faktorisati.
Output
Na standardni izlaz za svaki broj ispisati, u posebnom redu, njegovu faktorizaciju u gore opisanom formatu, u
redosledu datim na ulazu.
Example
Example Input

Example Output

3
10
23
180

2^1*5^1
23^1
2^2*3^2*5^1

Example Description
Constrains
1 n 200.000,
2 bi 200.000.
Resenje:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxN = 230000;
int n, x, pr[maxN];
void prostiFaktor() {
for (int i = 1; i < maxN; i++) {
pr[i] = i;
}
for (int i = 2; i * i < maxN; i++) {
if (pr[i] != i) continue;
for (int j = i * i; j < maxN; j += i) {
pr[j] = min(pr[j], i);
}
}

}
int main() {
prostiFaktor();
scanf("%d", &n);
while (n--) {
scanf("%d", &x);
while (x > 1) {
int br = 0, tekFaktor = pr[x];
while (pr[x] == tekFaktor) {
x /= pr[x];
++br;
}
printf("%d^%d", tekFaktor, br);
if (x != 1) printf("*");
}
if (x != 1) printf("%d^%d", x, 1);
printf("\n");
}
return 0;
}
28.
Uvod u algoritme / Matematiki algoritmi 1 / PRIME1
Da li je prost
Status: Reen
Id: PRIME1
Izvor: N/A
Tip: Basic
Teina: 1
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 64 mb
Broj test sluajeva: 30
Uspenost: 0% (0/0)
Problem Statement
Ispitati da li je dati prirodan broj n prost.
Input
U prvom i jedinom redu standradnog ulaza nalazi se prirodan broj n.
Output
U prvi i jedini red standardnog izlaza ispisati 'DA' ukoliko je broj n prost a u suprotnom ispisati 'NE' (velika slova,
bez navodnika).
Example
Example Input

Example Output

35

NE

Example Description
Broj 35 nije prost jer je npr. deljiv sa 5.
Constrains
1 n 1.000.000.000.000
Note
Broj n moe biti jako veliki, koristiti 64-bitne tipove podataka (int64 u Pascal-u, odnosno long long u C/C++-u).
Resenje:
#include <stdio.h>

#include <math.h>
int prost(long long n){
int i,koren = (int) sqrt(n*1.0);
if (n == 1) return 0;
if (n == 2) return 1;
if (n % 2 == 0) return 0;
for(i=3; i <koren+2; i+=2)
if (n%i == 0) return 0;
return 1;
}
int main(){
long long n;
scanf("%lld", &n);
if (prost(n)==1) printf("DA\n");
else printf("NE\n");
//system("PAUSE");
return 0;
}
29.
Uvod u algoritme / Matematiki algoritmi 1 / GCDLCM
NZD i NZS
Status: Reen
Id: GCDLCM
Izvor: N/A
Tip: Basic
Teina: 1
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 64 mb
Broj test sluajeva: 20
Uspenost: 0% (0/0)
Problem Statement
Data su dva prirodna broja a i b. Odrediti njihov najvei zajedniki delilac i najmanji zajedniki sadralac.
Input
Prvi i jedini red standardnog ulaza sadri dva prirodna broja a i b razdvojena razmakom.
Output
U prvom redu standradnog izlaza ispisati najvei zajedniki delilac brojeva a i b. U drugom redu standardnog izlaza
ispisati namanji zajedniki sadralac brojeva a ib.
Example
Example Input

Example Output

12 18

6
36

Example Description
(12, 18) = 6, [12, 18] = 36.
Constrains
1 a, b 1.000.000.000
Note
Najvei zajedniki sadralac moe ispasti iz opsega 32-bitnog tipa podataka. Koristiti 64-bitne tipove podataka (int64
u Pascal-u, odnosno long long u C/C++-u).

Resenje:
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
using namespace std;
int a, b, nzd;
int NZD(int a, int b) {
if (b == 0) return a;
return NZD(b, a%b);
}
int main() {
scanf("%d %d", &a, &b);
nzd = NZD(a, b);
printf("%d\n%lld\n", nzd, (long long)a*b/nzd);
return 0;
}
30.
Uvod u algoritme / Matematiki algoritmi 1 / BASECON
Konverzija baza
Status: Nije pokuano reavanje
Id: BASECON
Izvor: N/A
Tip: Basic
Teina: 1
Vremensko ogranienje: 1 s
Memorijsko ogranienje: 64 mb
Broj test sluajeva: 20
Uspenost: 0% (0/0)
Problem Statement
Dat je nenegativan ceo broj u brojnom sistemu sa osnovom A. Prebaciti ga u brojni sistem sa osnovom B.
Input
U prvom redu standardnog ulaza nalaze se, redom, prirodni brojevi A i n, razdvojeni razmakom. A predstavlja osnovu
brojnog sistema a n - broj "cifara" posmatranog broja u brojnom sistemu sa osnovom A. Naredni red sadri n brojeva
razdvojenih razmakom - "cifre" posmatranog broja u sistemu sa osnovom A, poreane od cifre najmanje teine do
cifre najvee teine. Na kraju, tei red sadri prirodan broj B - osnovu brojnog sistema u kojoj treba predstaviti
posmatrani broj.
Output
U prvom redu standardnog izlaza ispisati jedan prirodan broj m - broj cifara posmatranog broja u brojnom sistemu sa
osnovom B. U narednom redu ispisati tih m"cifara" posmatranog broja u sistemu sa osnovom B, razdvojene
razmakom, poreane od cifre najmanje teine do cifre najvee teine.
Example
Example Input

Example Output

12 4
6 10 0 3
7

5
42312

Example Description

Posmatrani broj ima zapis (3 0 10 6)_12 u sistemu sa osnovom 12 pa je njegova vrednost 612^0 + 1012^1 + 012^2
+ 312^3 = 5310. Broj 5310 ima zapis (2 1 3 2 4)_7 u sistemu sa osnovom 7, tj. ima 5 cifara i, poreane po teini od
najmanje do najvee, to su 4 2 3 1 2.
Constrains
2 A, B 1.000.000
1 n 30
Sve "cifre" iz sistema sa osnovom A bie iz segmenta [0, A - 1].
Vrednost posmatranog broja e uvek biti izmeu 1 i 1.000.000, ukljuivo.
Note
Koristimo termin "cifre" pod navodinicima jer one zapravo mogu biti brojevi vei od 9, kao to se moe videti na
datom primeru.
Resenje 1:
#include <iostream>
#include <cstdio>
#include <cmath>
int konverzija[50];
int konvertuj(int broj, int baza, int pow){
if(broj==0) return pow;
konverzija[pow] = broj%baza;
pow++;
broj/=baza;
return konvertuj(broj, baza, pow);
}
int main(){
int n, a, b;
int cifra;
long long broj = 0, pow = 1;
scanf("%d%d", &a, &n);
for(int i = 0; i<n; i++){
scanf("%d", &cifra);
broj+=(cifra*pow);
pow*=a;
}
scanf("%d", &b);
int max = konvertuj(broj, b, 0);
printf("%d\n", max);
for(int i = 0; i<max; i++)
printf("%d ", konverzija[i]);
}

31.

You might also like