Clasa a XI-a
Ziua 2
Problema 4
Buget de vacanta
Doi frati, Alin si Bogdan, urmeaza sa mearga intr-o vacanta la mare īn
vara acestui an si fireste vor sa aiba cat mai multi bani de cheltuit. Fiecare
are deja o suma de bani stransa, dar parintii le-au propus un joc an urma
carora pot castiga (dar si pierde !!) niste bani.
Iata īn ce consta jocul:
Pe o masa se afla asezate, intr-un sir, N bilete, pe fiecare fiind
vizibil un numar reprezentand o suma de bani (care poate fi pozitiva - bonus
sau negativa - penalizare). Cei doi muta pe rand (Alin, fiind mai īn varsta,
muta primul). O mutare consta din extragerea de catre un jucator a cel putin
unul si cel mult K bilete (K dat) dintr-una din extremitatile sirului.
Jocul se termina cand nu mai sunt bilete pe masa si fiecare din cei doi frati
primeste sau da, dupa caz, totalul sumelor de pe biletele extrase de el pe
parcursul jocului.
Programul dvs. il va ajuta pe Alin sa joace cat mai bine (sa castige o suma cat
mai mare de bani, sau, eventual, sa piarda cat mai putin). Celalalt jucator va
fi o biblioteca cu numele BOGDAN, pe care va trebui sa o utilizati in programul
dumneavoastra, astfel:
In Pascal: uses bogdan;
In C : #include "bogdan.cpp"
Pe calculator va este furnizata o versiune demonstrativa a acestei biblioteci,
īn scopul testarii programului (bogdan.tpu, respectiv bogdan.cpp din directorul
ZIUA2 ).
Aceasta versiune creeaza o pozitie arbitrara a jocului, dupa care raspunde la
mutarile dumneavoastra tot arbitrar. Fireste, versiunea folosita in timpul
evaluarii programului dumneavoastra va juca mult mai bine. Totusi, interfata
va fi absolut aceeasi, respectiv cea prezentata mai jos īn Pascal si C:
const Stanga=False;
Dreapta=True;
#define Stanga 0
#define Dreapta 1;
- (conventie folosita mai jos).
procedure IncepeJoc;
void IncepeJoc();
- Va fi prima procedura din biblioteca apelata de programul dumneavoastra si
va fi apelata o singura data. In caz contrar programul dvs. va fi terminat si
va primi 0 puncte pe acel test.
function ValoareN:Integer;
int ValoareN();
- Intoarce valoarea lui N (numarul de bilete de pe masa), presupusa in domeniul
1..100;
function ValoareK:Integer;
int ValoareK();
- Intoarce valoarea lui K (numarul maxim de bilete pe care are dreptul sa le ia
la fiecare pas, numar natural īntre 1 si N).
function ValoareBilet(Numar:Integer):Integer;
int ValoareBilet(int Numar);
- Intoarce valoarea inscrisa la inceput pe biletul cu numarul de ordine "Numar"
(numerotarea se face de la stanga la dreapta), sau 0 daca "Numar" nu este īn
intervalul 1..N. Valoarea poate fi orice numar intreg pe 16 biti.
Atentie! Cele trei functii de mai sus pot fi apelate oricand pe
parcursul jocului, dar ele vor īntoarce aceleasi valori, anume cele
corespunzatoare pozitiei initiale, chiar daca īntre timp unele dintre bilete au
fost luate.
procedure MutaAlin(Parte:Boolean;Numar:Integer);
void MutaAlin(int Parte, int Numar);
- Prin aceasta procedura declarati o mutare, luand "Numar" din partea "Parte"
(Stanga, respectiv Dreapta, dupa conventia de mai sus).
Atentie! Daca mutarea este ilegala (nu pot fi luate atatea bilete),
programul va fi terminat si va primi 0 puncte pe testul respectiv.
procedure MutaBogdan(Var Parte:Boolean;Var Numar:Integer);
int MutaBogdan(int &Parte,int &Numar);
- Aceasta procedura intoarce raspunsul bibliotecii la mutarea dvs. anterioara.
Procedura are un rol pur informativ, mutarea fiind de fapt calculata imediat
dupa declararea mutarii dvs. cu procedura MutaAlin. Procedura MutaBogdan va
intoarce aceeasi valoare pana cand veti face alta mutare. Daca apelati
MutaBogdan īnainte de primul apel MutaAlin, programul va fi terminat si va
primi 0 puncte pe testul respectiv.
Programul va fi terminat automat de biblioteca, cand programul dvs. sau
biblioteca iau toate piesele ramase. Daca programul dvs. se termina mai repede
va primi punctajul 0.
Observatie:
-Cerintele de memorie si timp ale bibliotecii (in ambele versiuni) sunt
neglijabile(de exemplu, memoria necesara este mai mica decāt 1KB RAM).
-La aceasta problema vi se cere doar sursa programului, aceasta urmand
sa fie compilata folosind cealalta versiune a unitatii inainte de
evaluare.
Punctaj maxim posibil: 75 puncte