You are on page 1of 33

Спои листи Problem 1 (0 / 2) 

Дадени се две двострано поврзани листи чии што јазли содржат по еден природен
број. Од овие две листи треба да се креира нова двострано поврзана листа, на тој
начин што јазлите ќе се додаваат наизменично и тоа само оние со парни броеви (прв
елемент од првата листа (ако е парен), последен од втората (ако е парен), втор
елемент од првата листа (ако е парен), претпоследен од втората (ако е парен) итн.).
Јазлите со парни броеви кои ќе останат треба да се додадат на крај во резултантната
листа. Потоа на резултантната листа се додаваат само преостанатите јазли со
непарни елементи од првата листа и преостанатите јазли со непарни елементи но во
обратен редослед од втората листа.

Освен наведените три листи немате право на користење на дополнителни помошни


листи.

Во првиот ред од влезот е даден бројот на јазли во првата листа, потоа во вториот ред
се дадени броевите од кои се составени јазлите по редослед во првата листа, па во
третиот ред е даден бројот на јазли во втората листа, и на крај во четвртиот ред
броевите од кои се составени јазлите по редослед во втората листа. На излез треба
да се испечатат јазлите по редослед во резултантната споена листа.

Забелешка: При реализација на задачите МОРА да се користат дадените структури, а


не да се користат помошни структури како низи или сл.

Sample input

20

18 5 77 5 57 15 27 43 26 0 31 61 50 63 34 25 52 4 72 24

50

90 31 93 52 40 13 8 77 43 82 71 99 95 56 13 30 4 14 10 27 33 12 18 52 5 59 48 25 80 84 57 2 64 94 4 62 7 68
77 64 27 7 39 91 59 24 87 95 22 28

Sample output

18 28 22 24 26 0 64 50 68 34 62 4 52 94 4 64 72 2 24 84 80 48 52 18 12 10 14 4 30 56 82 8 40 52 90 5 77 5 57
15 27 43 31 61 63 25 95 87 59 91 39 7 27 77 7 57 25 59 5 33 27 13 95 99 71 43 77 13 93 31

18 28 22 24 26 0 64 50 68 34 62 4 52 94 4 64 72 2 24 84 80 48 52 18 12 10 14 4 30
56 82 8 40 52 90 5 77 5 57 15 27 43 31 61 63 25 95 87 59 91 39 7 27 77 7 57 25 59
5 33 27 13 95 99 71 43 77 13 93 31
Делумно решение: Задачата се смета за делумно решена доколку се поминати 7 тест
примери.

Име на класата: SpoiListi

Your solution:
Programming language: C Java

#include<stdio.h>

#include<malloc.h>

//Implementacijata na dvojnata lista e so jazel vodich

typedef struct element{

int info;

struct element *llink, *rlink;

}node;

typedef node * nodep;

node * novaDvojna()

node *v = (node *)malloc(sizeof(node));

v -> llink = v;

v -> rlink = v;

return v;

void ins_before(nodep l, nodep newn)


{

//nodep t=NEW(node);

//t->info=x;

l->llink->rlink=newn;

newn->llink=l->llink;

newn->rlink=l;

l->llink=newn;

void dodadi(node **pok_v, int broj){

//dodavanja na broj na kraj na dvojnata lista

node *temp;

temp=(node *)malloc(sizeof(node));

temp->info=broj;

temp -> llink = (*pok_v) -> llink;

temp -> rlink = *pok_v;

(*pok_v) -> llink -> rlink = temp;

(*pok_v) -> llink = temp;

void NovaLista(node *v1,node *v2,node *v3)

node *p=v1->rlink;

node *q=v2->llink;

node *temp1=p,*temp2=q;

int flag=0;
while((p!=v1)||(q!=v2))

if(flag==0)

flag=1;

// temp1=p;

if(p->info%2==0)

temp1=p;

p=p->rlink;

temp1->llink->rlink=temp1->rlink;

temp1->rlink->llink=temp1->llink;

temp1->llink=v3->llink;

temp1->rlink=v3;

v3->llink->rlink=temp1;

v3->llink=temp1;

// ins_before(&v3,&temp1);

else

//flag=1;

p=p->rlink;

}
}

else if(flag==1)

flag=0;

if(q->info%2==0)

temp2=q;

q=q->llink;

temp2->rlink->llink=temp2->llink;

temp2->llink->rlink=temp2->rlink;

temp2->llink=v3->llink;

temp2->rlink=v3;

v3->llink->rlink=temp2;

v3->llink=temp2;

//ins_before(&v3,&temp2);

else

// flag=0;

q=q->llink;

p=v1->rlink;

q=v2->llink;
}

if(p->rlink==v1)

while(q!=v2)

if(q->info%2==0)

temp2=q;

q=q->llink;

temp2->rlink->llink=temp2->llink;

temp2->llink->rlink=temp2->rlink;

temp2->llink=v3->llink;

temp2->rlink=v3;

v3->llink->rlink=temp2;

v3->llink=temp2;

// ins_before(&v3,&temp2);

else

q=q->llink;

else if(q->llink==v2)
{

while(p!=v1)

if(p->info%2==0)

temp1=p;

p=p->rlink;

temp1->rlink->llink=temp1->llink;

temp1->llink->rlink=temp1->rlink;

temp1->llink=v3->llink;

temp1->rlink=v3;

v3->llink->rlink=temp1;

v3->llink=temp1;

//ins_before(&v3,&temp1);

else

p=p->rlink;

p=v1->rlink;

q=v2->llink;

while(p!=v1)
{

p->rlink->llink=p->llink;

p->llink->rlink=p->rlink;

p->llink=v3->llink;

p->rlink=v3;

v3->llink->rlink=p;

v3->llink=p;

// ins_before(&v3,&p);

p=p->rlink;

while(q!=v2)

q->rlink->llink=q->llink;

q->llink->rlink=q->rlink;

q->llink=v3->llink;

q->rlink=v3;

v3->llink->rlink=q;

v3->llink=q;

//ins_before(&v3,&q);

q=q->rlink;

}
node *temp;

temp=v3->rlink;

while(temp!=v3)

printf("%d ",temp->info);

temp=temp->rlink;

int main(){

node *rezLista=NULL, *lista1=NULL, *lista2=NULL;

int i,n,info;

lista1=novaDvojna();

lista2=novaDvojna();

rezLista=novaDvojna();

scanf("%d",&n);

for(i=0;i<n;i++)

scanf ("%d", &info);

dodadi(&lista1,info);

scanf("%d",&n);

for(i=0;i<n;i++)
{

scanf ("%d", &info);

dodadi(&lista2,info);

//vasiot kod tuka!

NovaLista(lista1,lista2,rezLista);

return 0;

JAVA

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

class DLLNode<E> {

protected E element;

protected DLLNode<E> pred, succ;

public DLLNode(E elem, DLLNode<E> pred, DLLNode<E> succ) {

this.element = elem;

this.pred = pred;

this.succ = succ;

}
@Override

public String toString() {

return element.toString();

class DLL<E> {

private DLLNode<E> first, last;

public DLL() {

// Construct an empty SLL

this.first = null;

this.last = null;

public void deleteList() {

first = null;

last = null;

public int length() {

int ret;

if (first != null) {

DLLNode<E> tmp = first;

ret = 1;

while (tmp.succ != null) {

tmp = tmp.succ;
ret++;

return ret;

} else

return 0;

public void insertFirst(E o) {

DLLNode<E> ins = new DLLNode<E>(o, null, first);

if (first == null)

last = ins;

else

first.pred = ins;

first = ins;

public void insertLast(E o) {

if (first == null)

insertFirst(o);

else {

DLLNode<E> ins = new DLLNode<E>(o, last, null);

last.succ = ins;

last = ins;

}
public void insertAfter(E o, DLLNode<E> after) {

if (after == last) {

insertLast(o);

return;

DLLNode<E> ins = new DLLNode<E>(o, after, after.succ);

after.succ.pred = ins;

after.succ = ins;

public void insertBefore(E o, DLLNode<E> before) {

if (before == first) {

insertFirst(o);

return;

DLLNode<E> ins = new DLLNode<E>(o, before.pred, before);

before.pred.succ = ins;

before.pred = ins;

public E deleteFirst() {

if (first != null) {

if (first.succ == null){

last = null;

first = null;

else{
DLLNode<E> tmp = first;

first = first.succ;

first.pred = null;

return tmp.element;

return null;

public E deleteLast() {

if (first != null) {

if (first.succ == null)

return deleteFirst();

else {

DLLNode<E> tmp = last;

last = last.pred;

last.succ = null;

return tmp.element;

// else throw Exception

return null;

@Override

public String toString() {

String ret = new String();


if (first != null) {

DLLNode<E> tmp = first;

ret += tmp + "<->";

while (tmp.succ != null) {

tmp = tmp.succ;

ret += tmp + "<->";

} else

ret = "Prazna lista!!!";

return ret;

public DLLNode<E> getFirst() {

return first;

public DLLNode<E> getLast() {

return last;

public class SpoiListi {

public static void main(String[] args) throws IOException {


DLL<Integer> lista1 = new DLL<Integer>(), lista2 = new DLL<Integer>();

BufferedReader stdin = new BufferedReader(new InputStreamReader(

System.in));

String s = stdin.readLine();

int N = Integer.parseInt(s);

s = stdin.readLine();

String[] pomniza = s.split(" ");

for (int i = 0; i < N; i++) {

lista1.insertLast(Integer.parseInt(pomniza[i]));

s = stdin.readLine();

N = Integer.parseInt(s);

s = stdin.readLine();

pomniza = s.split(" ");

for (int i = 0; i < N; i++) {

lista2.insertLast(Integer.parseInt(pomniza[i]));

//vasiot kod tuka!

Билет Problem 2 (0 / 0) 
Магдалена во Париз се вози на метро. Билетот, кој се купува преку автомат, чини n
евра, а тој го купува со парички од една или две евра така што паричките ги пушта
една по една во автоматот. Ако Магдалена на почеток има барем по n парички од една
и од две евра, и го земаме предвид редоследот на пуштање на паричките, тогаш на
колку начини може Магдалена да купи билет?

На влез се дава колку евра е билетот, а на излез треба да се испечати број на начини
за купување на билетот.

Пример: (1, 2, 1), (1, 1, 2), (2, 1, 1), (1, 1, 1, 1) и (2, 2) се 5 можни различни начини за
купување на билет од 4 евра.

Делумно решение: Задачата се смета за делумно решена доколку се поминати 7 тест


примери.

Име на класата: Bilet

Your solution:
Programming language: C Java

#include<stdio.h>

void sortiraj_paricki(int coins[], int n) {

int i,j,tmp;

for (i=0;i<n;i++)

for (j=i+1;j<n;j++)

if (coins[i] < coins[j]) {

tmp = coins[i];

coins[i] = coins[j];

coins[j] = tmp;

}
// coins e niza so vrednostite na parickite koi se dadeni

// n e brojot na paricki

// sum e dadenata suma

// coinsNum e niza za resenieto so brojot na paricki od sekoja golemina na paricka

int greedyCoins(int coins[], int n, int sum, int coinsNum[]) {

sortiraj_paricki(coins, n);

int i = 0;

int br = 0; // vkupniot broj na paricki za da se formira dadenata suma

while (sum > 0) {

coinsNum[i] = sum / coins[i];

sum -= coinsNum[i] * coins[i];

br += coinsNum[i];

i++;

while(i < n) {

coinsNum[i] = 0;

i++;

return br;

int bilet(int n)
{

// Vasiot kod ovde

int coins[9];

coins[0] = 1;

coins[1] = 2;

coins[2] = 5;

coins[3] = 10;

coins[4] = 50;

coins[5] = 100;

coins[6] = 500;

coins[7] = 1000;

coins[8] = 5000;

int m=9;

int coinsNum[1000];

int broj=greedyCoins(coins,m,n,coinsNum);

int main()

int n;

scanf("%d",&n);

printf("%d\n",bilet(n));

return 0;

JAVA

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Bilet {

public static int bilet(int n)

// Vasiot kod ovde

public static void main(String[] args) throws Exception {

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int n = Integer.parseInt(br.readLine());

System.out.println(bilet(n));

Снежна бура Problem 3 (0 / 0) 


Во една земја се случило големо снежно невреме и одредени градови биле целосно
затрупани со снег. Во земјата постојат патишта, така што од секој град може да се оди
до секој друг град движејќи се по тие патишта, но после снежната бура не можело да
се движи преку директни патишта помеѓу два градови од кои барем едниот од нив е
затрупан со снег. Владата на земјата ве ангажирала вас да помогнете во достава на
храна до затрупаните градови. Имате на располагање еден камион и едно беспилотно
летало. Со камионот може да се движите само низ незатрупани градови и тој е
наполнет со храна, а на него може да се носи и беспилотното летало. Од камионот
може да се лансира беспилотното летало кое што ќе однесе храна до одредена
дестинација и ќе се врати пак назад во камионот. Леталото може да се програмира да
се движи само над патиштата. Сите директни патишта помеѓу два градови се долги по
10 километри. Резервоарот на леталото може да се наполни со гориво за поминување
на 40 километри без застанување. Тргнувате со камионот (и леталото на него) од еден
почетен град (почетниот град секогаш е незатрупан) и потребно е да доставувате
храна до затрупани градови на начин дефиниран погоре. Кој е максималниот број на
затрупани градови до кои што може да доставите храна?

Пример: Дадена е следната мрежа од градови. Секој град е означен со индекс од 0 до


8. Доколку градот е натрупан со снег го означуваме со сино.

Да претпоставиме дека иницијално се наоѓаме во градот 0. Ја правиме следната


секвенца од акции:

 Со камионот одиме од градот 0 до градот 2


 Од градот 2 го лансираме леталото кон градот 4. Тоа доставува храна и се
враќа назад (поминува 20 километри).
 Од градот 2 го лансираме леталото кон градот 3. Тоа тргнува од градот 2,
поминува преку градот 4, стигнува до градот 3 каде што доставува храна и се
враќа назад по истата патека (поминува 40 километри).
 Со камионот се движиме од градот 2 кон градот 0.
 Со камионот се движиме од градот 0 кон градот 1.
 Од градот 1 го лансираме леталото кон градот 5. Тоа тргнува од градот 1,
поминува преку градот 3, стигнува до градот 5 каде што доставува храна и се
враќа назад по истата патека (поминува 40 километри).
Не можеме да доставиме храна до други затрупани градови (градот 7). Ова е едно од
неколкуте можни сценарија за достава на храна. За овој пример максималниот број на
затрупани градови до кои што можеме да доставиме храна е 3.

Забелешка: Почетниот град секогаш ќе биде незатрупан.

Делумно решение: Задачата се смета за делумно решена доколку се поминати 7 тест


примери.

Име на класа (Java): SnowStorm

Your solution:

Programming language: C Java

#include<stdio.h>

#include<string.h>

#include<malloc.h>

#define MAXVERTS 100

#define MEMCHECK(x) if(x==NULL) { printf("Nema memorija!\n"); exit(-1); }

typedef struct cityType {

int zatrupan;

} city;

city gradovi[MAXVERTS];

// Implementacija na netezinski nasocen graf so pomos na niza od listi na sosednost

typedef city* info_t;


typedef struct element {

int index;

info_t info;

struct element *link;

} node;

typedef struct graphAdjList{

int num_nodes;

node *adjList[MAXVERTS];

} graph;

int adjacent(graph *g,int x,int y)

{ // proveruva dali ima vrska od jazelot so indeks x do jazelot so indeks y

node *tmp;

for(tmp=g->adjList[x]; tmp!=NULL; tmp=tmp->link)

{ // ako postoi vrska

if (tmp->index==y)

return 1;

return 0;

void addEdge(graph *g,int x,int y,info_t yInfo)

{ // dodava vrska od jazelot so indeks x do jazelot so indeks y

node *tmp;

for(tmp=g->adjList[x]; tmp!=NULL; tmp=tmp->link)


{ // ako veke postoi takva vrska da ne se duplira

if (tmp->index==y)

return;

// se vnesuva vrskata t.e. nov jazel vo listata na sosednost na x

node *p=(node *)malloc(sizeof(node));

p->info=yInfo;

p->index=y;

p->link=g->adjList[x];

g->adjList[x]=p;

void deleteEdge(graph *g,int x,int y)

// ja brise vrskata megu jazlite so indeksi x i y

// t.e. go brise jazelot y od listata na sosednost na x

node *p,*last;

for (p=g->adjList[x]; p!=NULL; p=p->link) {

if (p->index==y)

break;

if (p==NULL) return; // ako nema takva vrska za brisenje

if(p==g->adjList[x]) // ako najdenata vrska e na pocetok na listata

g->adjList[x]=p->link;

else

{
// naoganje na prethodnikot na jazelot sto treba da se izbrise

for (last=g->adjList[x];(last!=NULL)&&(last->link!=NULL);last=last->link) {

if (last->link==p)

break;

last->link=p->link;

free(p); // brisenje

int main(){

int i,j,k;

int N, tmp;

char str_zatrupan_so_sneg[15];

int a, b;

scanf("%d\n", &N); // broj na gradovi

for (i=0;i<N;i++) {

scanf("%d %s", &tmp, str_zatrupan_so_sneg);

if (str_zatrupan_so_sneg[0] == 'd') {

gradovi[i].zatrupan = 1;

} else {

gradovi[i].zatrupan = 0;

}
int i_num_nodes;

int sosedIndex; int sosedInfo;

graph *g = (graph *)malloc(sizeof(graph)); // treba da se raboti so ovoj graf

g->num_nodes=N;

for(i=0;i<g->num_nodes;i++)

g->adjList[i]=NULL;

int M; // broj na rabovi

scanf("%d", &M);

for(i=0;i<M;i++) {

scanf("%d %d", &a, &b);

addEdge(g,a,b,&gradovi[b]);

addEdge(g,b,a,&gradovi[a]);

int pocetok; // poceten grad

scanf("%d", &pocetok);

// vasiot kod ovde

// moze da pisuvate funkcii koi sto vi se potrebni ili da gi menuvate postoeckite klasi/funkcii

return 0;

}
JAVA

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.util.LinkedList;

import java.util.StringTokenizer;

public class SnowStorm {

public static void main(String[] args) throws Exception {

int i, j, k;

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

int N = Integer.parseInt(br.readLine()); // broj na gradovi

Graph g = new Graph(N); // treba da se raboti


so ovoj graf

for (i = 0; i < N; i++) {

StringTokenizer st = new StringTokenizer(br.readLine());

st.nextToken();

String str_zatrupan = st.nextToken();

if (str_zatrupan.equals("da")) {

g.adjList[i] = new GraphNode(i, new City(true));

} else {

g.adjList[i] = new GraphNode(i, new City(false));

}
int M = Integer.parseInt(br.readLine()); // broj na rabovi

for (i = 0; i < M; i++) {

StringTokenizer st = new StringTokenizer(br.readLine());

int a = Integer.parseInt(st.nextToken());

int b = Integer.parseInt(st.nextToken());

g.addEdge(a, b);

g.addEdge(b, a);

int pocetok = Integer.parseInt(br.readLine()); // poceten grad

// vasiot kod ovde

// moze da pisuvate funkcii koi sto vi se potrebni ili da gi menuvate postoeckite klasi/funkcii

class City {

boolean zatrupan;

City(boolean zatrupan) {

this.zatrupan = zatrupan;

@Override

public String toString() {


if (zatrupan == true) {

return "zatrupan";

} else {

return "nezatrupan";

class Graph {

int num_nodes;

GraphNode<City> adjList[];

@SuppressWarnings("unchecked")

public Graph(int num_nodes) {

this.num_nodes = num_nodes;

adjList = (GraphNode<City>[]) new GraphNode[num_nodes];

int adjacent(int x, int y) {

// proveruva dali ima vrska od jazelot so

// indeks x do jazelot so indeks y

return (adjList[x].containsNeighbor(adjList[y])) ? 1 : 0;

void addEdge(int x, int y) {

// dodava vrska od jazelot so indeks x do jazelot so indeks y

if (!adjList[x].containsNeighbor(adjList[y])) {
adjList[x].addNeighbor(adjList[y]);

void deleteEdge(int x, int y) {

adjList[x].removeNeighbor(adjList[y]);

@Override

public String toString() {

String ret = new String();

for (int i = 0; i < this.num_nodes; i++) {

ret += i + ": " + adjList[i] + "\n";

return ret;

class GraphNode<E> {

private int index;//index (reden broj) na temeto vo grafot

private E info;

private LinkedList<GraphNode<E>> neighbors;

public GraphNode(int index, E info) {

this.index = index;

this.info = info;
neighbors = new LinkedList<GraphNode<E>>();

boolean containsNeighbor(GraphNode<E> o) {

return neighbors.contains(o);

void addNeighbor(GraphNode<E> o) {

neighbors.add(o);

void removeNeighbor(GraphNode<E> o) {

if (neighbors.contains(o)) {

neighbors.remove(o);

@Override

public String toString() {

String ret = "INFO:" + info + " SOSEDI:";

for (int i = 0; i < neighbors.size(); i++) {

ret += neighbors.get(i).info + " ";

return ret;

}
@Override

public boolean equals(Object obj) {

@SuppressWarnings("unchecked")

GraphNode<E> pom = (GraphNode<E>) obj;

return (pom.info.equals(this.info));

public int getIndex() {

return index;

public void setIndex(int index) {

this.index = index;

public E getInfo() {

return info;

public void setInfo(E info) {

this.info = info;

public LinkedList<GraphNode<E>> getNeighbors() {

return neighbors;

}
public void setNeighbors(LinkedList<GraphNode<E>> neighbors) {

this.neighbors = neighbors;

Sample input
9
0 ne
1 ne
2 ne
3 da
4 da
5 da
6 ne
7 da
8 ne
11
0 1
0 2
1 3
2 4
3 4
3 5
4 6
5 6
5 7
6 8
7 8
0

Sample output
3

You might also like