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