40
1. secventa de suma maxima ***- sa se afiseze secventa de suma maxima dintr-un sir de nr intregi si valoarea acestei sume. ex: n=8 si sirul 2, -4,-3,5,-4,7,8,-2 se afiseaza suma=16 (5, -4,7,8). la fiecare pas al parcurgerii vectorului: a. verificare semnul secv curente sc: a.1. daca sc>0 atunci sc=sc+elem curent a.2. daca sc<0 atunci sc=0 si sc=elem curent (resetarea sc) b. actualizarea secventei de suma maxima dca se poate, cu pastrarea indicilor de inceput p / sfirsit u al secventei. max=a[1];sc=a[1];p=1,u=1;pc=1; for(i=2;i<=n;i++) { if(sc>0) sc+=a[i]; else { sc=a[i];pc=i; } if(sc>max) {p=pc; u=i;max=sc;} } for(i=p;i<=u;i++) scrie a[i]; 2. secventa de produs maxim ***- pt un sir de n numere intregi,in care exista cel putin un elem pozitiv, sa se det secventa de elm consec ce determina un produs maxim. p1=1,p2=0,p=1,u=1,pc1=1,max=a[1]; for(i=1,i<=n;i++) { if(a[i]!=0) { p1*=a[i]; if(p2!=0) p2*=a[i]; if( p2==0 && a[i]<0) {p2=1;pc2=i+1;} //p2 devine 1 la primul numar negativ if(p1>max) {max=p1;p=pc1;u=i;} if(p2>max) {max=p2;p=pc2;u=i;} } else {p1=1;pc1=i+1;p2=0;} //A } for(i=p;i<=u;i++) scrie a[i]; succesiv se inmultesc elem din vector la p1 si p2, iar max pastreaza produsul maxim la un moment dat. p1 si p2 se reseteaza daca elem curent este 0 (linia A)

Pregătire olimpiadă

Embed Size (px)

DESCRIPTION

Algoritmi pregatire olimpiada

Citation preview

Page 1: Pregătire olimpiadă

1. secventa de suma maxima ***- sa se afiseze secventa de suma maxima dintr-un sir de nr intregi si valoarea acestei sume. ex: n=8 si sirul 2,

-4,-3,5,-4,7,8,-2 se afiseaza suma=16 (5, -4,7,8).la fiecare pas al parcurgerii vectorului:a. verificare semnul secv curente sc:a.1. daca sc>0 atunci sc=sc+elem curenta.2. daca sc<0 atunci sc=0 si sc=elem curent (resetarea sc)b. actualizarea secventei de suma maxima dca se poate, cu pastrarea indicilor de inceput p / sfirsit u al secventei.max=a[1];sc=a[1];p=1,u=1;pc=1;for(i=2;i<=n;i++){ if(sc>0) sc+=a[i]; else { sc=a[i];pc=i; } if(sc>max) {p=pc; u=i;max=sc;}}for(i=p;i<=u;i++) scrie a[i];

2. secventa de produs maxim ***- pt un sir de n numere intregi,in care exista cel putin un elem pozitiv, sa se det secventa de elm consec ce determina un

produs maxim.p1=1,p2=0,p=1,u=1,pc1=1,max=a[1];for(i=1,i<=n;i++){ if(a[i]!=0) { p1*=a[i]; if(p2!=0) p2*=a[i]; if( p2==0 && a[i]<0) {p2=1;pc2=i+1;} //p2 devine 1 la primul numar negativ if(p1>max) {max=p1;p=pc1;u=i;} if(p2>max) {max=p2;p=pc2;u=i;} } else {p1=1;pc1=i+1;p2=0;} //A}

for(i=p;i<=u;i++) scrie a[i];succesiv se inmultesc elem din vector la p1 si p2, iar max pastreaza produsul maxim la un moment dat.p1 si p2 se reseteaza daca elem curent este 0 (linia A)

3. descompunerea factorialului n! - se utilizeaza vectorul prim ce va memora toate cele m numere prime mai mici decit n.prim[1]=2; m=1;p=3;while(p<=n){ i=1; while(i<=m) { if(p% prim[i]==0) i=n; else i++;}

Page 2: Pregătire olimpiadă

if(i!=n) prim[++m]=p; p+=2;for(i=1;i<=m;i++) { q=prim[i]; r=0; x=n/q; while(x>0) {r+=x; x/=q;} } if (r>0) scrie q,r;}

4. n sportivi , cu tricouri inscriptionate de la 1 la n , au participat la m concursuri. clasamentul final pentru un concurs se memoreaza cu un vector ,unde a[i]

=concurentul de pe locul i a devansat un numar de a[i] concurenti ( ce au pe tricou un numar mai mare decit al concurentului i). pentru fiecare din cele m concursuri se pastreaza informatiile in forma aceasta. toti sportivii au evoluat la cele m concursuri, sa se det ce concurenti au evoluat ( la fiecare concurs locul ocupat a fost strict mai mic decit la concursul anterior).

de ex pentru n=5, m=2 si rezultatele (3,2,2,1,0) , (3,3,1,1,0) se va afisa : 1 si 4.a- vector ce retine clasamentul pt fiecare concurs;p- vector ce retine pozitia fiecarui concurent la ultimul concurs desfasurat. daca concurentul i nu a avut o evolutie ascendenta, fata de concursul anterior

atunci p[i]=n+1;viz- indica pentru fiecare concurs in parte da fiecare concurent a trecut sau nu linia de sosire.

for(k=1;k<=m;k++) //pentru fiecare concurs { for(j=1;j<=n;j++) { viz[j]=0;cin>>a[j];} for(j=1;j<=n;j++) { k=n+1;nr=0; while ( (k>1) && nr<=a[j] ) {k--; if (viz[k]==0) nr++;} viz[k]=1; if(p[k]==0) p[k]=j; else { if (p[k]>j) && (p[k]!=n+1) p[k]=j; else p[k]=n+1; } }}

5. cerc- 2n copii , fiecare cu un cartonas cu un numar intre 1 si 2n, sint asezati pe un cerc. extragindu-i din k in k sa paraseasca cercul cei ce au numer

pare pe cartonas, in ordine crescatoare, apoi cei cu numerele impare, tot in ordine crescatoare. afisarea incepe de la primul copil extras din cerc. ex : pt

Page 3: Pregătire olimpiadă

n=4 si k=3, copii sint dispusi in cerc astfel 2,5,8,4,7,3,6,1. extragerea va fi : 2,4,6,8,1,3,5,7.

se completeaza un vector din k in k pozitii, ignorindu-le pe cele deja ocupate. indicele curent ce se va completa traverseaza prin incrementare toate cele 2n

pozitii, devenind 1 cind atinge valoarea 2n. vectorul se completeaza initial cu elem pare 2,4,.....2, si apoi cu cele impare 1,3,5,....2n-1.

x=1;for(i=1;i<=2n;i++){ nr=0; while(nr<k) { viz[i]=0; if(x<2n) x++; else x=1; } if(i==0) x=1; if(i<=n) a[x]=2*i; else a[x]= ((i-1)%n)*2+1);

}

6. multiplu- sa se det un nr in baza 10 divizibil cu n si format doar din cifre de 1 si 0.-se considera sirul :1,11,111,1111,.....,111,,,1(n cifre de 1). - printre ele exista si un numar multiplu de n ( acesta este nr cautat).- toate numerele anterioare dau restul 1,2....n-1 la %n. deoarece exista n numere si n-1 resturi rezulta ca exista 2 numere ce dau acelasi rest (principiul lui

Dirichlet), si deci diferenta acestor 2 numere este numarul cautat.- daca r este restul pentru un nr oarecare din sir, format din i cifre de 1,atunci nr ce contine i+1 cifre de 1 va avea restul (r*10+1)%n.- elem a[r1] reprezinta nr de cifre de 1 din care este format un nr din sir care da restul r1 la %n.

a[1]=1;r=1;nr=1;ok=1;while(ok){ nr++; r1=(r*10+1)%n; if(r1!=0) { if(a[r1]==0) {a[r1]=nr; r=r1;} else { for(i=1,i<=nr-a[r1];i++) scrie 1; for(i=1;i<=a[r1];i++) scrie 0; ok=0;

Page 4: Pregătire olimpiadă

} } else { ok=0; for(i=1;i<=nr;i++) scrie 1; }

}7. suma a 2 numere a si b, ambele cu cel mult 100 de cifre.

t=0;i=1;while(i<=a[0] ||(i<=b[0])||(t>0)){ t+=a[i]+b[i]; a[i]=t%10; t/=10; i++;} a[0]=i-1;t-cifra de transporta[0]- cite cifre are nr ab[0]- cite cifre are nr b

8. produsul a 2 numere a si b, unde a are cel mult 100 de cifre, iar b un numar <=30000.t=0;i=1;while(i<=a[0]) || (t>0){ t+=a[i]*b; a[i]=t%10; t/=10; i++;}a[0]=i-1;

9. diferenta a 2 numere a si b, fiecare cu cel mult 100 de cifre.t=0;i=1;while(i<=a0]) || (t>0){ a[i]=a[i]-b[i]-t; if(a[i]<0) t=1; else t=0; a[i]=a[i]+t*10; i++;}while(a[0]>0) && (a[a[0]]==0) a[0]--;

10. citul impartirii a 2 numere a si b, unde a are cel mult 100 de cifre, iar b un numar <=30000.

Page 5: Pregătire olimpiadă

t=0;i=a[0];while(i>0){ t=t*10+a[i]; a[i]=t/b; t=t%b; i--;}while(a[0]>0) && (a[a[0]]==0) a[0]--;11. paianjen. O retea este formata din n noduri/puncte, feicare de coordonate int. fiecare nod este unit prin fire paralele cu axele de coordonate de cei 4

vecini. Un paianjen este plasat initial in punctul (0,0). El se poate deplasa la fiecare secunda in una din cele 4 directii, la unul din nodurile vecine.In cite moduri se poate deplasa din pozitia initiala in cea finala.pozitia finala (x,y) se citeste de la consola iar pozitia initiala este (0,0).- pt fiecare pozitie se det in cite moduri se poate ajunge acolo prin relatia a[x][y]=a[x-1][y]+a[x][y-1]

citeste x,y // de ex pt (2,3) se va afisa 10for(i=0,i<=x;i++) a[0][i]=1;for(i=0,i<=y;i++) a[i][0]=1;for(i=1;i<=x;i++) for(j=1;j<=y;j++) a[i][j]=a[i-1][j]+a[i][j-1]scrie a[x][y].

12. se dau 2 siruri de lungime n (n<1000) cu elemente doar de 1 si -1. se considera un nr k (k<1000). sa se transforme primul sir in al 2-lea utilizind doar

operatia: se selecteaza o secventa de k elemete consecutive si se invereaza semnul la toate numerele cuprinse in aceasta zona. secventa poate sa incepa

de la primul element si sa se sfirseasca la ultimul element.sa se afiseze numarul minim (m) de operatii si cele m pozitii de inceput de unde se aplica operatia.de ex pt n=4 si k=2 si cele 2 siruri: 1,-1,1,-1 ; -1,-1,1,1 se va afisa m=3 si 1,2,3.

for(i=1;i<=n-k+1;i++){ if (a[i]!=b[i]) { for(j=i;j<=i+k-1;j++) a[j]=-a[j]; scrie i;}}

13. semne- pentru un numar n(<1000) sa se gaseasaca o combinatie de semne + si - ( adica un vector x unde x[i] poate fi +1 sau -1) astfel incit

n=x[1]*pow(1,2)+x[2]*pow(2,2)+...+x[k]*pow(k,2). unde k = numarul operatorilor folositi.de ex pentru n=2 se va afisa - - - +

Page 6: Pregătire olimpiadă

n=4 + - - +n=8 + - - + + - - +n=5 + + - - +

se utilizeaza inductie dupa n si relatia: pow(x,2)-pow(x+1,2)-pow(x+2,2) +pow(x+3,2)=4.

utilizind solutia pentru valoarea m se poate det solutia pentru m+4.se construieste secventa de semne pentru 0,1,2,3 (functie de n%4) iar apoi se adauga de n/4 ori secventa + - - +

if(n%4==1) scrie '+'else if(n%4==2) scrie "---+"; else if(n%4==3) scrie "-+";for(i=1;i<=n/4;i++) scrie "+--+";

14. un text de cel mult 1000000 caractere. Tb sa se det lungimea medie a cuvintelor din text (un cuvint este format din literele mari/mici ale alfabetului

englez).

lung medie=(lungimea totala a cuvintelor)/( nr de cuvinte)

a=-1;b=-1;s=0;nr=0;while( !f.eof() ){ cin>>c;if (c=litera mica/mare ) if(a=-1) {a=0;b=0;} else b++;else {if(a!=-1) {s=s+b-a+1; nr++;} a=-1;b=-1; }}if(a!=-1) { s=s+b-a+1; nr++;}

scrie s/nr;

15. palindrom cubic. sa se det cel mai mare numar cub perfect <n, si care sa fie palindrom.(n<2000000000).de ex pt n=1340 se va afisa 1331.

fiecare numar din intervalul [ 1 , pow(n,1/3) ] se ridica la puterea a 3-1. si apoi verificat daca este palindrom.

Page 7: Pregătire olimpiadă

i=1;nr=0;while(i*i*i<=n){ j=i*i*i; c=0; while (j>0) {c++; a[c]=j%10; j/=10;} ok=1; for(j=1;j<=c/2;j++) if (a[j]!=a[c-j+1] ) ok=0; if (ok) && (nr<i*i*i*i) nr=i*i*i; i++;}scrie nr;*************************1. sa se det ultima cifra nenula a lui n!. (n<100000).se det produsul factorilor primi la puterila la care apar, ignorind totii factorii de 5 si un numar de factori de 2 egal cu numarul factorilor de 5.

citeste n; u=1;for(i=2;i<=n;i++){ nr=i; while(nr%2==0) {nr/=2; n2++;} while(nr%5==0) {nr/=5; n5++;}u=(u*(nr%10))%10;}for(i=1;i<n2-n5;i++) u=(u*2)%10;scrie u;

2. un sir de n (<100) de numere fiecare de cel mult 9 cifre.sa se det daca:a. fiecare nr din sir are cel putin o cifra comuna cu numarul anterior;b. fiecare nr din sir se obtine din nr anterior prin b1. eliminarea unei cifre;b2. adaugarea unei cifre.

ex:n=7173,17,7,72,472,4572,572a. dab1.dab2. nu

n=4177,17,117,1117a.dab1.da

Page 8: Pregătire olimpiadă

b2. dase utilizeaza vectori auxiliari cu elemente de tip logic, definiti ca indici pe cifre a[0],......,a[9].

3. fie n<=1000 si p numar natural. sa se det exponentul maxim E astfel incit 1*2*....*n sa fie duvizibil cu pow(p,E).

n=7,p=6 se va afisa E=2 ( 1*2*3...*7=5040, care este divizibil cu 36=pow(6,2) dar nu este divizibil cu 216=pow(6,3) ).

se utilizeaza formula ( valabila pt numar prim p):(int)n/p + (int)n/pow(p,2) + (int)n/pow(p,3) + .....+0se descompune p in factori primi,si utilizind formula se det cea mai mica putere a unui factor prim al sau.citest n,p; max=0;for(i=2;i<=sqrt(p);i++){ nr=0; while(p%i==0) {nr++; p/=i;} if(nr>0) { j=i;r=0; while(j<=n) { r=r+n/j; j*=i;} if(max<r) max=r; }}if(p>1){ j=p;r=0; while(j<=n) { r=r+n/j j*=p;} if(max<r) max=r;scrie r; // scrie max}

4. O piesa de forma unui L ( lungimea de 3 unitati si latimea de 2 unitati) are toate cele 4 patratele colorate cu aceeasi culoare k. o tabla de joc de

dimeniuni nxm (<=100) are patratele colorate cu o anumita culoare (codificate prin numere de la 1 la 100). Piesa in forma de L se poate aseza pe aceasta

tabla de joc doar daca toate patratele au aceeasi culoare k, iar patratele vecine nu au culoarea k. O patratica este vecina cu piesa daca are cel putinn o

latura comuna.dindu-se n,m,k si o configuratie a tablei sa se det nr maxim de piese ce se pot aseza pe tabla.ex:n=7,m=5,k=2

Page 9: Pregătire olimpiadă

si tabla:2, 2, 5, 4, 52, 1, 2, 4, 22, 3, 2, 2, 23, 2, 1, 1, 13, 2, 1, 2, 22, 2, 1, 1, 23, 4, 1, 1, 2se va afisa 3

indicatie: se parcurge matricea si se pleca de la presupuneraea ca orice elem de valoare k reprezinta capatul unei piese valide. se verifica toate cele 8

asezari ale piesei din punctul curent considerat.

5.Intervale- se considera n intervale de forma [ai,bi] cu ai,bi numere intregi. un interval poate fi eliminat din sirul intervalelor daca este inclus strict in alt

interval. sa se det nr maxim de intervale care pot fi excluse.de ex:n=50 102 93 81 156 11se va afisa 3indicatie: se sorteaza crescator dupa limita inferioara a intervalelor. La parcurgerea intervalelor se va actualiza cel mai mare capat din dreapta (maxDr).

Orice interval care are capatul din dreapta <maxdr este inclus in altul.

6. pentru deschiderea unui seif sint necesare 2 coduri (cuvinte formate din literele mari ale alfabetului englez). seiful se deschide pentru orice pereche de

coduri care verifica conditiile:- contin doar caracterele permise- fiecare parola are un numar asociat, astfel: A=1,B=2 ......Z=26. Produsul numerelor asociate fiecarei litere din parola reprezinta numarul asociat parolei.

pentru ca o pereche de coduri sa fie acceptata trebuie ca aceste 2 numere sa fie prime intre ele ( cmmdc =1).date intrare : 2 coduridate iesire: cele 2 numere asociate codurilor si un mesaj "acces permis" / "acces nepermis"

se memoreaza pentru fiecare numar asociat unui cod, factorii primi, intr-un vector. Apoi se verifica daca exista factori primi comuni.

Page 10: Pregătire olimpiadă

7. Aisberg. Un aisberg este descris cu ajutorul unei matrici ( 0 = aer, 1= gheata) :

regula topirii acestui aisberg este:in intervalul t de timp se topeste acea portiune care are cel putin in 2 vecinatati aer. Se produc astfel alte cimpuri de aer care se topesc in al 2-lea interval

de timp:0 0 0 0 0 0 00 1 2 3 2 1 00 0 3 4 3 0 00 0 3 4 3 0 00 1 2 3 2 1 00 0 0 0 0 0 00 0 0 0 1 0 0date intrare :-n si m ( <=40)-pe n linii cite m cifre de 1 sau 0 ( gheata sau aer). Obs: pe margini sigur este aer.

date iesire:-numarul t de unitati de timp necesare pentru topirea ghetii-t linii - pentru fiecare linie i de la 1 pina la t , cite unitati de gheata exista la inceputul intervalului de timp i.

de ex:date intrare:n=6 m=70 0 0 0 0 0 00 1 1 1 1 1 00 0 1 1 1 0 00 0 1 1 1 0 00 1 1 1 1 1 00 0 0 0 0 0 0date iesire:4161282

indicatie:Se va parcurge matricea de mai multe ori. La fiecare parcurgere trebuie sa se identifice numarul de elemente care se vor topi. Pentru pozitia care devine aer

la pasul curent trebuie sa se atribuie o valoare negativa, astfel incit sa nu mai participe la urmatoarea parcurgere a matricei.

Page 11: Pregătire olimpiadă

8. se consedera sirurile a[1],a[2],.....a[n] si b[1],b[2],.....b[m]. Sa se maximizeze valoarea expresiei e=a[i]x[i]+a[2]x[2]+....+a[n]x[n], unde x[i] sint elemente

ale sirului b.de ex :date intrare:n=6,m=8si sirurile: a=3,7,-10,5,-1,2 ; b=10,5,20,20,-2,7,9,-10;date iesire:441 (valoarea expresiei e)

indicatie:pentru 2 siruri cu n si m elemente , sortate crescator, daca primul are k elem negative si p elem pozitive (n=k+p), se cupleaza primele k elemente din sirul

1 cu k elemete din sirul 2 si celelalte p elemente din sirul 1 cu ultimele p elemete din sirul 2.

int n,m,a[100],b[100],i,j,r;if(n>m) inversare sirurile a si bsortare sirul a;sortare sirul b;r=0;i=0;while( a[i+1]<0) && (i+1<=n) i++;for(j=1;j<=i;j++) r=r+a[j]*b[j];for(j=i+1;j<=n;j++) r=r+a[j]*b[m-n+j];scrie r;

9. o zona dreptunghiulara contine nxm parcele. pe fiecare parcela exista un brad cu globuri. Gigel doreste sa isi aleaga un brad, dar care sa contina cit mai

multe globuri. El va lua toate globurile din brazii situati in parcelele invecinate ( N,S,E,V ) cu bradul ales initial si le va pune in acesta. gigel doreste sa mai

aleaga inca k-a brazi in acest fel. Sa se determine care k brazi pot fi alsi astfel incit numarul total de globuri din brazii alesi sa fie maxim.date intrare: n,m,ksi n linii cu cite m numere fiecare ce reprezinta numarul de globuri din bradul asezat in parcela respectivadate iesire:numarul total de globuri din cei k brazi alesik linii ,pe fiecare din aceste linii indicii bradului ales.

de ex:pentru datele de intrare:4 4 32 1 6 17

Page 12: Pregătire olimpiadă

3 4 8 61 8 8 814 4 8 2datele de iesire:881 43 3 4 1iar matricea ar arata asa:2 1 6 173 4 0 61 0 40 014 4 0 2

indicatie: trebuie sa se identifice de k ori elementul ce are suma vecinilor maxima la pasul respectiv. Initial trebuie bordata matricea cu valoarea 0, astfel

incit fiecare elemt din matrice sa aiba vecini.

10. Domino. O piesa de domino are o forma dreptunghilara, impartita in doua, pe fiecare din cele 2 sectiuni este inscrisa o cifra intre 0 si 6. 2 piese

alaturate formeaza o secventa valida daca cifrele din sectiunile ce sau invecinat sint egale sau complemetare (au suma lor egala cu 6).de ex [2-4][2-1] , [3-4][4-5] sint 2 secvente valide.Pe o masa exista un sir cu n piese de domino. Gigel extrage una din ele si o aseaza ,in aceeasi pozitie (adica fara rotitre) la sfirsitul acestui sir. El doreste

ca sirul nou ce se va forma va contine o secventa valida de piese de lungime maxima.Trebuie sa se identifice ce piesa trebuie mutata la finalul sirului pentru a obtine astfel un sir cu o subsecventa valida de lungime maxima.date intrare:n (<=10000)2n cifre din intervalul 0-6date iesire: numarul de ordine al piesei din sir care este extrasa si mutata la finalul sirului si lungimea maxima a secventei valide determinate. (solutia nu este unica,

dar se va afisa doar una).

de ex pentru n=4 si sirul 2,3,4,5,4,5,3,4 se va afisa 1 si 2.indicatie: se utilizeaza tipul struct. Algoritmul presupune o etapa de stergere a unui element dintr-un sir si cautarea subsecventei de lungime maxima.

11. Domino 2- Piesa de domino dreptunghiulara este impartita in 2 patrate , pe fiecare din aceste patrate exista marcata o cifra din intervalul [0,6]. se

Page 13: Pregătire olimpiadă

considera un sir de n piese de domino. Acesta este un sir bine aranjat daca pentru oricare 2 piese asezate consecutiv, patratele lor alaturate au fie aceeasi

cifra fie suma acestor sifre este egala cu 6. De ex sirul [0,2][2,5][1,3] este bine aranjat. Sa se determine daca se poate obtine un sir bine aranjat de piese

de domino ,piesele putindu-se roti dar fara schimbarea pozitiei in sir.date de intrare:mai multe perechi de cifre ( nu se precizeaza numarul perechilor)date de iesire:Se va afisa sirul bine aranjat sau mesajul "imposibil".

de ex:date intrare:2 3 4 5 6 5 0 3date iesire:3 2 4 5 5 6 0 3Algoritmul utilizeaza tehnica programarii dinamice (liniare). Se construieste o matrice cu 2 coloane iar elementele matricii sint 0 sau 1, astfel:a[i][1]=1 daca se poate obtine un sir pina in pozitia i cu piesa nerotitaa[i][2]=1 daca se poate obtine un sir pina in pozitia i cu piesa rotita.

int n,i,j,p[100][2],t[100][2],a[100][2];n=0;while(!f.eof()) //citire din fisier{ f>>p[++n][1]; f>>[n][2];}a[1][0]=1;a[1][1]=1;for(i=2;i<=n;i++){ if (p[i][1]==p[i][2] sau p[i][1]+p[i][2]==6) si (a[i-1][0]=1) {a[i][0]=1; t[i][0]=0;} if (p[i][1]==p[i-1][1] sau p[i][1]+p[i-1][1]==6) si (a[i-1][1]=1) {a[i][0]=1; t[i][0]=1;} if (p[i][2]==p[i-1][2] sau p[i][2]+p[i-1][2]==6) si (a[i-1][0]=1) {a[i][1]=1; t[i][1]=0;} if (p[i][2]==p[i-1][1] sau p[i][2]+p[i-1][1]==6) si (a[i-1][1]=1) {a[i][1]=1; t[i][1]=1;}}i=n;if (a[n][0]== 1) j=0;else j=1;while(i>0){ if (j==1) scrie p[i][1], p[i][2] else scrie p[i][2],p[i][1] j=t[i][j]; i--;}matricea t retine daca piesa este rotita/nerotita.

Page 14: Pregătire olimpiadă

12. Rima - o Rima se misca intr-o zona patratica, intrind/iesind de sub pamint. Ea pleaca pin punctul [1][1] inaintind spre centrul zonei, mergind paralel cu

cele 4 laturi ( fara a trece printr-un loc de 2 ori) descriind astfel o spirala. Deplasarea se face inaintind alternativ fie la suprafata fie pe sub pamint. la intilnirea

unei gropi pe traseu, rima intra in groapa daca deplasarea in acel moment la suprafata sau va iesi la suprafata daca deplasarea curenta este pe sub pamint.

Pe harta gropile sint marcate cu 0, iar restul zonelor fara groapa cu 1.sa se determine numarul total al gropilor prin care rima a iesit la suprafata precum si coordonatele acestora.de ex n=4si 1 1 0 11 1 1 11 1 1 00 0 1 1

se afiseaza 2 si perechile (3,4) si (4,1)

de ex n=4 si1 1 1 01 0 1 01 1 0 10 0 0 1 se afiseza 3 si perechile (2,4), (4,2) , (2,2).

13. numere super-prime. se considera sirul numerelor prime p1,p2,.....pn,..... (n<=10000) . Un numar este super-prim daca el este prim si numarul sau de

ordine in sirul numerelor prime este un numar prim.de ex:3 este super-prim caci este al 2-lea nr in sirul nr prime5 este super-prim caci este al 3-lea nr in sirul nr prime7 nu este super-prim caci este al 4-lea in sirul nr prime.Sa se scrie un program care descompune un numar dat in suma de numere super-prime. daca exista mai multe solutii se va afisa doar cea care contine

mai putini termeni in suma.de ex pt n=6 se afiseaza 3 3 se determina sirul nr prime mai mici decit n si apoi utilizind programarea dinamica se det submultimea de suma n ,cu nr minim de elemente.

-vectorul s unde s[i]=j, i=0..n, si semnifica suma i se poate obtine prin insumarea a j elemente.- vectorul t unde t[i]=k, i=1..n, si semnifica ca suma de valoare i s-a obtinut cu ultimul termen p[k]-vectorul p ce memoreaza toate nr prime mai mici decit n

Page 15: Pregătire olimpiadă

int n,i,j,k,np,p[1000],nr[10001],t[10001],ok;

k=0;np=0;for(i=2;i<=n;i++){//** ok=1; j=2; while (j<=sqrt(i)) si (ok==1) { if (i%j==0) ok=0; j++; } if (ok) { //* k++; ok=1;j=2; while (j<=sqrt(k)) si (ok==1) { if(k%j==0) ok=0; j++; } if (ok) p[++np]=i; } //*}//**nr[0]=0;for(i=1;i<=n;i++) nr[i]=un nr f mare // in comparatie

for(i=1;i<=np;i++) for(j=0;j<=n-p[i];j++) if(nr[j+p[i]]>nr[j]+i) {nr[j+p[i]]=nr[j]+1; t[j+p[i]]=p[i];}while(n>0){ scrie t[n];n=n-t[n];}

14. Ariciul. Planul unei livezi de forma dreptunghiulara nxm este fromat din zone patrate cu latura l. In fiecare zona creste un pom. din fiecare pom in zona respectiva pot cadea pe jos citeva mere. In coltul stinga-sus se afla un arici care vrea sa ajunga in coltul dreapta-jos. In livada exista restrictii de deplasare: ariciul se poate deplasa din zona curenta in zona vecina din dreapta sau din jos. Sa se determine numarul maxim de mere pe care le va stringe ariciul in drumul sau.n,m apartin [2,100].planul livezii se reprezinta cu o matrice a unde a[i][j] indica numarul de mere cazute din pom in zona de coordonate (i,j).elementele a[i][j] <1000.date de intrare : n , m si elementele matricei.de ex:3 30 4 10 1 11 0 1

Page 16: Pregătire olimpiadă

la iesire 7 (mere).algoritmul utilizeaza metoda programarii dinamice ce realizeaza construirea matricei b(nxm) unde b[i][j] va reprezenta numarul maxim de mere care pot fi culese pina in pozitia (i,j).b[1][1]=a[1][1];prima linie se determina prin b[1][j]=b[1][j-1]+a[i][j];prima coloana se va determina prin b[i][1]=b[i-1][1]+a[i][j];restul elementelor prin b[i][j]=max(b[i-1][j],b[i][j-1])+a[i][j];

#include <fstream>using namespace std;int max(int a,int b){ if(a>b) return a; else return b;}ifstream f("arici.in");ofstream("arici.out");int main(){ int a[20][20],b[20][20]={0},n,m,i,j; f>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) f>>a[i][j]; b[1][1]=a[1][1]; for(j=1;j<=m;j++) b[1][j]=b[1][j-1]+a[1][j];//linia 1 for(i=1;i<=n;i++) b[i][1]=b[i-1][1]+a[i][1];//coloana 1 for(i=2;i<=n;i++) for(j=2;j<=m;j++) b[i][j]=max(b[i-1][j],b[i][j-1])+a[i][j]; g<<b[n][m]; return 0;}

15.paranteze. se considera siruri de 2n (n<501) paranteze rotunde inchise sau deschise. Un sir de paranteze se numeste valid daca in orice pozitie numarul parantezelor deschise pina la acea pozitie este mai mare sau egal cu numarul parantezelor inchise pina la acea pozitie. Sa se determine cite siruri de paranteze valide exista. date intrare n, iar date de iesire un numar care reprezinta cite siruri valide de lungime 2n exista.de ex n=3, se va afisa 5:((()))()()()(())()(()())()(())problema reprezinta de fapt numarul lui Catalan: (2n)!/(n!*(n+1)!)

Page 17: Pregătire olimpiadă

16. se considera un sir de n<10001 nr naturale. Sa se realizeze un grafic pe verticala in ordine descrescatoare a numarului de aparitii a valorilor din sir.ex: pt n=12 si valorile 3,4,12,5,4,2,5,3,3,3,12,5 se va afisa:

3 5 4 12 2-----------------------------------------------------------* * ** * * ** * * * *

17.Subsir crescator- Se considera un sir de n (1<=n<=2000) numere naturale din intervalul [2,30000]. Sa se determine cel mai lung subsir strict crescator al sirului, cu proprietatea ca toate numerele sale sint numere prime. Se va afisa lungimea subsirului si elementele sale.de ex:n=102 5 3 7 7 9 11 8 6 13se va afisa:52 3 7 11 13int n,i,j,ok,r,poz,s[2000],nr[2000],t[2000];r=0;poz=0;for(i=1;i<=n;i++){ ok=1; for(j=2;j<=(int)sqrt(i);j++) if (s[i]%j==0) ok=0; if(ok) { nr[i]=1; t[i]=0; for(j=1;j<=i-1;j++) if ((nr[i]<nr[j]+1) &&(s[j]<s[i])) {nr[i]=nr[j]+1; t[i]=j;} } else nr[i]=0; if(r<nr[i]) {r=nr[i];poz=i;}}scrie nr[poz];// scrie r;while(poz>0) { scrie s[poz]; poz=t[poz]; }

18. matricea a(nxm), cu n si m avind valori din intervalul [1,200], are elementele din multimea {0,1}. Numim patrat o multime de elemente a[i][j] ce formeaza un subtablou cu laturile egale. Sa se det aria maxima a unui patrat din matricea a.de ex:n=8,m=8 si matricea01011101

Page 18: Pregătire olimpiadă

10111101001110101111111110111010111101110101111111111111se va afisa 9.se va utiliza o matrice b, unde b[i][j] va avea ca valoare lungimea laturii unui patrat de arie maxima cu coltul dreapta-jos in (i,j).se va utiliza relatia de recurenta: b[i][j]=1+min(b[i-1][j],b[i][j-1],b[i-1][j-1]) care se calculeaza doar daca a[i][j]=1;#include <fstream>using namespace std;int min(int a,int b){ if(a>b) return b; else return a;}ifstream f("patrat.in");ofstream g("patrat.out");int main(){ int a[20][20],n,m,i,j,r,aux; f>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) f>>a[i][j];

r=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { aux=a[i-1][j-1]; aux=min(a[i][j-1],aux); if(a[i][j]) a[i][j]=min(a[i-1][j],aux)+1;//sau //if(a[i][j]) a[i][j]=min(a[i-1][j],min(a[i][j-1],a[i-1][j-1])); if (r<a[i][j]) r=a[i][j]; } g<<r*r; return 0;}

19.matricea a(nxm), cu n si m avind valori din intervalul [1,200], are elementele din multimea {0,1}. Numim romb o multime de elemente a[i][j] ce formeaza un subtablou cu proprietatile: a[i][j]=1 si |i-x|+|j-y| <=r, unde x si y reprezinta centrul rombului, iar r lungimea diagonalei sale (diagonale egale). Sa se determine rombul ce are valoarea r maxima.

Page 19: Pregătire olimpiadă

de ex:n=8,m=8 si matricea0101110110111101001110101111111110111010111101110101111111111111se va afisa 2.se va utiliza o matrice b, unde b[i][j] va avea ca valoare lungimea lungimea unei diagonale a rombului maxim cu coltul de jos in (i,j).se va utiliza relatia de recurenta: b[i][j]=1+min(b[i-1][j+1],b[i-1][j-1],b[i-2][j]) care se calculeaza doar daca a[i][j]=a[i-1][j]=1;#include <fstream>using namespace std;int min(int a,int b){ if(a>b) return b; else return a;}ifstream f("romb.in");ofstream g("romb.out");int main(){ int a[20][20],n,m,i,j,r,b[20][20]; f>>n>>m; for(i=1;i<=n;i++) for(j=1;j<=m;j++) f>>a[i][j];

r=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(a[i][j]==1) { b[i][j]=-1; t=1+min(b[i-1][j+1],min(b[i-1][j-1],b[i-2][j])) ; if (a[i-1][j]==1) &&(b[i][j]>t) b[i][j]=t; } else b[i][j]=0; if(r<b[i][j]) r=b[i][j]; } g<<r-1; return 0;}

Page 20: Pregătire olimpiadă

20. partitionare in trei. Se considera un sir de n (10<=n<=32000) numere naturale. Acesta trebuie partitionat in 3 secvente de elemente consecutive. Fiecare din secvente va fi caracterizata de suma elemntelor sale. Sa se realizeze o partitionare astfel incit diferenta dintre suma maxima si cea minima sa fie cit mai mica. Elementele sirului fac parte din [1,30000].de ex:n=10 si sirul4 7 1 2 2 3 9 3 4 4se va afisa 3Pentru fiecare valoare a secventei s1 se va cauta locul in care se imparte s2 si s3 in valori cit mai egale ( prin cautare binara).int n,i,st,dr,m,s1,s2,s3,a[32000],s[32000]={0},d;citeste n;for(i=1;i<=n;i++) citeste a[i];d=30001;for(i=1;i<=n;i++) s[i]=s[i-1]+a[i];

for(i=2;i<=n-1;i++){ st=i+1;dr=n; while(st<dr) { m=(st+dr)/2; if (s[m]-s[i]<s[n]-s[m]) st=m; else dr=m-1; } s1=s[i]; s2=s[st]-s[i]; s3=s[n]-s[st]; if(d>max(s1,max(s2,s3)) -min(s1,min(s2,s3))) d=max(s1,max(s2,s3)) -min(s1,min(s2,s3)); s2=s[st+1]-s[i]; s3=s[n]-s[st+1]; if(d>max(s1,max(s2,s3)) -min(s1,min(s2,s3))) d=max(s1,max(s2,s3)) -min(s1,min(s2,s3));} scrie d;

21. Pentru un sir cu n (1<=n<=10000) elemente intregi sa se det cite perechi de elemente distincte exista cu proprietatea ca suma lor este m (1<=m<=1000000000).de ex pentru n=8 si m=10 si sirul 7 2 3 5 4 6 1 8 se va afisa 3se sorteaza sirul si apoi pentru fiecare element s[i] se cauta de cite ori exista valoarea m-s[i].

22. un poligon convex are n (<65536) virfuri. Virfurile neadiacente se unesc prin segmente. Sa se determine cite puncte de intersectie exista intre aceste segmente stiind ca oricare 3 segmente nu se intersecteaza in acelasi punct.de ex pentru n=5 exista 5 puncte de intersectie.solutia este combinari de n luate cite 4= n!/4!*(n-4);

Page 21: Pregătire olimpiadă

int factorial (int x){int f=1;for(int i=1;i<=x;i++) f*=i;return f;}

int main(){int n;cin>>n;int c=factorial(n);c=c/factorial(4);c=c/factorial(n-4);cout<<c;}

23.Un grup de n (<51) de persoane pentru care se cunosc ziua de nastere z a fiecarei persoane din grup (z<366). Sa se determine aceste zile de nastere astfel incit in grup sa avem k perechi de persoane nascute in aceeasi zi. daca exista mai multe solutii se afiseaza doar una din ele, daca nu exista solutii se afiseaza 0.

date intrare: n,z,kdate iesire: n valori cuprinse intre 1 si z.de ex pentru n=5,z=365,k=4 se va afisa 1 1 1 2 2se construieste matricea a(nxk) unde a[i][j]=numarul minim de zile pentru a avea i persoane in camera si j perechi de persoane nascute in aceeasi zi.daca a[n][k]<=z exista solutie.a[i][j] se determina prin relatia de recurenta: a[i][j]=min(a[i-x,j-x*(x-1)/2]+1) unde x<=i;matricea t este utilizata pentru a reconstrui solutia;

int n,z,k,i,j,a[50][1225],t[50][1225],d,x;d=0; for(i=0;i<=n;i++) for(j=0;i<=k;j++) a[i][j]=1000; // o valoare mult mai mare decit valorile posibile luate de elem matricei a;a[0][0]=0;a[1][0]=1;t[1][0]=1'for(i=2;i<=n;i++) for(j=1;j<=k;j++) for(x=1;x<=i;x++) if( j-x*(x-1)/2>=0) && (i-x>=0) && (a[i][j]>a[i-1][j-x*(x-1)/2]+1) {a[i][j]=a[i-1][j-x*(x-1)/2]+1; t[i][j]=1;}if (a[n][k]>z) scrie 0;else while(n>0) { i=t[n][k]; for(j=1;j<=i;j++) scrie a[n][k];

Page 22: Pregătire olimpiadă

n-=i; k-=i*(i-1)/2; } 24. se considera o secventa de n (<=200000) numere intregi din [-10000,10000]. Sa se determine un subsir de suma maxima cu proprietatea ca oricare 2 elemente ale subsirului nu sint aflate pe pozitii consecutive in secventa.de ex pentru n=7 si sirul 3 7 5 -1 6 6 2 se afiseaza 16:se va utiliza vectorul a si b unde:a[i]=suma maxima a unui subsir avind elemente alese din portiunea de indici de la 1 pina la i, dar fara a utiliza elemetul de pe pozitia ib[i]=suma maxima a unui subsir avind elemente alese din portiunea de indici de la 1 pina la i dar cu utilizarea elementului de pe pozitia l

vom avea relatiile de recurenta:a[i]=max(a[i-1],b[i-1]);b[i]=a[i-1]+s[i];solutia este data de max9a[n],b[n]).

int n,i,x,a[2],b[2];citeste n;for(i=1;i<=n;i++){ citeste x; a[1]=max(a[0],b[0]); b[1]=a[0]+x; a[0]=a[1]; b[0]=b[1];}scrie max(a[n],b[n]);

25. Se da un set de n timbre distincte si limita superioara k a nr de timbre care pot fi lipite pe un plic. Sa se determine cea mai mare secv de val consec de la 1 pina la M centi care se poate obtine.intrare:k (<=200) - nr total de timbre ce se poate folosin nr de valori ale timbrelor (<=50)cele n valori ale timbreloriesire:nr maxim m de val consec care se pot forma cu maxim k timbre de valori datept k=5 si n=2 si valorile 1 3 se afiseaza m=13se construieste vect m unde m[i]=nr minim de timbre necesare pt a obtine i centi. Este necesara o rel de recurenta.

26. fractii . pentru n=4 avem fractiile:1/1,1/2,1/3,1/4,2/1,2/3,3/1,3/2,3/4,4/1,4/3. ( 11 fractii)

Page 23: Pregătire olimpiadă

pt un n (n<1000001) oarecare cite fractii exista

p(x) -nr de numere < x, prime cu x.raspunsul este 1+2*(p(2)+p(3)+...+p(n))pt calculul p(x) se poate folosi proprietatea p(a*b)=p(a)*p(b) daca cmmdc(a,b)=1.

27. pt n (<pow(10,100))dat sa se det ultima cifra a sumei pow(1,1)+pow(2,2)+...pow(n,n)n=1 -> 1n=2 -> 5n=3 -> 2n=4 -> 8n=5 -> 3raspunsul se repeta din 100 in 100, deci se det n%100 si se prepoceseaza raspunsurile pt valori de la 0 la 99.

28. o permutare are k maxime daca exista fix k pozitii distincte in permutare, pt care elementul curent este mai mare decit toate elementele din stinga lui. Sa se det cite permutari de lungime n ( permutari de n elem ) cu k maxime exista.n=5 si k=3 se afiseaza 35

a[i][j]=nr de permutari de lungime i cu j maxime. rel: a[i][j]=a[i-1][j]+(i-1) +a[i-1][j-1];

29.un sir de n (<=500000) nr intregi din [-30000,30000]. baza unei secvente=minimul valorilor elem din secventa.pt un k dat sa se det o secventa de lungime cel putin k cu baza maxima.intrare: n,k si elementele sirului.iesire: pozitia de inceput/sfirsit de lungime cel putin k cu baza maxima si valoarea acestei baze.

n=8,k=3 si sirul -1,2,3,1,0,4,8,6 se afiseaza 6 8 4se parcurge sirul, cind ajungem la un elem de pe pozitia x, se elimina toate elem de la sfirsitul lui q > a[x]. daca elem de la inceput se afla pe o pozitie <x-k+1 ( nu este in secv de lungime k ce se termina in x) se elimina pina cind acesta va avea pozitia >=x-k+1. elem de la inceput va fi baza secv de lung k ce se termina in elem x. cum nu se fac mai mult de n eliminari si n inserari q va contine cel mult n elem distincte;int n,k,i,st,dr,r,poz,a[500000],q[500000];cin n,k;pt i=1,n cin a[i];r=infint;st=1;dr=0;pt i=1,k-1{ while (dr>=st) and (a[i]<=a[q[dr]]) dr--; dr++;

Page 24: Pregătire olimpiadă

q[dr]=i;}pt i=k,n{ while (st<=dr) and (a[i]<=a[q[dr]]) dr--; if (a[q[st]]>r {r=a[q[st]]; poz=i;}}

cout poz-k+1,poz,r;

30.o matrice nxm , indicele de linie/coloana incepe de la 1, cu elem din [-1000,1000].fiecare muta un jeton plasat pe un elem din matrice;mutarea consta in plasarea jetonului pe o alta pozitie si adaugarea val din poz respectiva la scorul jucatotului care a efectuat mutarea; jucatorul urmator poate sa mute jetonul doar in inter drept delimitat de coltul st-sus si pozitia curenta.jocul se termina cind un jucator ajunge in coltul st-sus.;initial scorul este 0 pt ambii jucatori.jucatorul care incepe alege pozitia initiala a jetonului.pp ca ambii jucatori joaca optim ( adica j1 va incerca sa maximizeze difer de scor iar j2 sa o minimizeze ) si ca j1 incepe jocul sa se det poz initiala ajet astfel incit diferenta de scor intre j1 si j2 sa fie maxima.date intrare: n,m si matriceaiesire: val acestei diferente maxime si poz initiala a jetonuluide ex n=1,m=6 si matricea 2 1 3 4 0 5 se va afisa 3 1 6;se constr c[i][j]=diferenta maxima de scor j1-j2 ( j1 eset cel ce incepe din (i,j) cu jetonul)c[i][j]=a[i][j]-max(c[x][y]) cu x<=i si y<=j;pt a calcula eficient c[i][j] se fol si b[i][j]=max(c[x][y]) cu x=1,i si y=1,j;

31. dintr-un set de n (<=100) de numere sa se determine un subset de 6 numere (care se pot repeta) astfel incit suma lor sa fie s (s<=600000000)intrare n,s si setul de n numereiesire : 6 numerede ex:n=3, s=131 2 3se va afisa : 1 1 2 3 3 3se genereaza toate tripletele (i,j,k) cu i,j,k <=n si se insereaza intr-un vector a[i]+a[j]+a[k]. vectorul se sorteaza iar apoi pt fiecare valoare x din vector se cauta binar valoarea s-x.

32.se considera un sir cu n (<=50000) nr intregi din [-25000,25000] . Sa se det o secventa cu suma elem maxima, de lungime cel putin k.intrare: n,k si sirul de n numereiesire: pozitia de inceput si de sfirsit a secventei si suma secventeide ex:n=8,k=30 -6 2 1 4 -1 3 -5

Page 25: Pregătire olimpiadă

se va afisa : 3 7 9

secv de lung minim k care se termina cu elem de pe poz i este fie secventa de pe pozitia i-1 + elem i sau elem i-k+1,i-k+2...i (ultimele k)

int n,k,i,val,start,st,dr,r,a[50000],s[50000];cin n,k;pt i=1,n { cin>>a[i]; s[i]=s[i-1]+a[i];}r=s[k]; st=1;dr=k;val=s[k]; start=1;pt i=k+1,n{ val+=a[i]; if (val<s[i]-s[i-k]) { val=s[i]-s[i-k]; start=i-k+1;} if (r<val) { r=val; st=start; dr=i;}}cout st,dr,r;

33.o matrice nxn ( n din [6,1000]) cu m buline rosii sau albastre ( m din intervalul [2n,100000]) in diferite pozitii ( exista cel putin o bulina rosie pe fiecare linie si cel putin o bulina albastra pe fiecare coloana). Se pot construi 2 poligoane ( nu neaparat convexe) cu acelasi nr de virfuri, unul din poligoane sa aiba in virfuri doar buline rosii iar celalalt doar albastre iar centrul de greutate al acestora sa coincida? ( indiferent de pozitia poligoanelor unul fata de altul - daca se intersecteaza sau sint incluse).CG pt un polig cu n vf (x1,y1), .... (xn,yn) este dat de ((x1+....+xn)/n ,(y1+...+yn)/n).sa se det cele 2 poligoane.intrare:n,msi m linii cu i,j,c reprezentind indicii de linie/coloana si culoarea unei buline.iesire:nr de vf pt un poligon si apoi indicii de vf pt polig rosu si apoi indicii de vf pt polig albastru.de ex :n=6,m=12 si1 3 r2 4 r3 1 r4 6 r5 2 r6 4 r2 1 a4 2 a3 3 a1 4 a6 5 a6 6 a se afiseaza:31 3 2 4 3 11 4 2 1 3 3

Page 26: Pregătire olimpiadă

initial introducem un pct rosu oarecare. pe coloana punctului rosu respectiv exista un punct albastru ( conform "exista cel putin o bulina rosie pe fiecare linie si cel putin o bulina albastra pe fiecare coloana" ) , se insereaza acel pct in lista, prin repetare la un mom dat se va ajunge la un pct care a mai fost in lista, deci un ciclu . pct rosii de pe ciclu vor reprezenta un polig iar pctele albastre un alt poligon. ( vor avea ac nr de vf).fie primul punct de coord (x1,y1) -> al 2-lea de coord x2,y1 -> apoi x2,y2 -> apoi x3,y2 ..... penultimul xk,yk-1, ultimul xk,yk ( care va coincide cu un alt pct xp,yp (p<k).se obs ca polig rosu va avea CG punctul ((xp+xp+1+...+xk-1)/(k-p), (yp+yp+1+...+yk-1)/(k-p)) iar polig albastru pe ((xp+1+xp+2+...+xk)/(k-p), (yp+1+yp+2+...+yk)/(k-p))

34. Cite trapeze se pot forma prin n puncte ,date prin coordonatele lor in plan (n<=1000). Coordonatele sint numere intregi din intervalul [0,2000000000].de ex pentru n=5 si coordonatele (0,0),(0,1),(1,4),(2,0),(3,1) se va afisa 1Un trapez are cel putin 2 laturi paralele deci se iau toate perechile de puncte ( segment) si se sorteaza in functie de panta dreptei ( unghiul dintre segment si axa ox). Pentru k segmente cu aceeasi panta se pot forma k*(k-1)/2 trapeze.

35.Dindu-se 2 siruri de caractere litere mici, de lungima maxima 500, sa se determine cel mai lung subsir comun al celor 2 siruri. Un subsir al unui sir este format din caractere ( nu neaparat consecutive) ale sirului respectiv, in ordinea in care acestea apar in sir.Cite subsiruri comune de lungime maxima distincte exista pentru cele 2 siruri? Doua subsiruri sint distincte daca exista cel putin un caracter in unul din ele care difera de caracterul din celalalt subsir de pe aceeasi pozitie.sa se determine restul impartirii numarului de subsiruri comune de lungime maxima distincte pentru cele 2 siruri la 666013.de ex pentru sirurile "banana" si "oana" se va afisa 1.

rezolvarea se bazeaza pe program dinamica. cele 2 siruri a(n) si b(m) ; se va construi initial matricea c[i][j]=lungimea celui mai lung subsir comun al sirurilor a[1..i] si b[1..j]. Se va calcula nr[i][j]=cite subsiruri comune de lung maxima exista pentru a[1..i] si b[1..j] ( modula 666013) . nr[i][j] se calculeaza doar cind a[i]=b[j], astfel pentru fiecare caracter c intre 'a' si 'z' se cauta ultima sa aparitie in sirul a[1..i-1] ( fie aceasta pozitia ii) si ultima sa aparitie in sirul b[1..j-1] ( fie jj).

daca c[i][j]=c[ii][jj]+1 se va aduna nr[ii][jj] la nr[i][j] - aceasta cond garanteaza ca subsirurile adaugate au lung maxima, iar faptul ca ii si jj reprezinta ultima aparitie a caracterului garanteaza ca nu se vor numara subsiruri identice. Pentru a det rezultatul final se aduna toate valorile nr[i][j] calculate, cu urmatoarea exceptie: daca exista pozitiile x si y astfel incit a[x]=a[i]=b[y]=b[j] se aduna nr[i][j] doar daca x<i si y<j ( pentru a asigura ca nu se numara subsiruri identice de mai multe ori).

36.Dindu-se un numar k (<=100000) sa se determine cel mai mic numar n care nu este divizibil cu primele k numere prime si nu este prim.de ex pentru k=3, n este 49.Paspunsul este cel de-al k-1-lea numar prim ridicat la patrat. Se utilizeaza ciurul lui Eratostene.int n,k,i,j,a[2000000]={0};cin>>k;

Page 27: Pregătire olimpiadă

pt i=2,1000000 a[2*i]=1;i=3;while(i<=2000000){ if (a[i]==0) { k--; if(k==0) {cout<<i*i;i=2000001;} j=i*i; while(j<=2000000) {a[j]=1; j=j+2*i;} } i+=2;}37. exista nr care au proprietatea ca se scriu in 2 baze de numeratie diferite prin 3 cifre identice. de ex. 273(10)=333(9)=111(16).sa se det toate numerele mai mici decit n (< 32001) cu aceasta proprietate.de ex pentru n=300 se va afisa 273 9 16 9 nr in baza 10 si celelalte 2 baze).un nr xxx(b) scris in baza 10 este nr=x*pow(b,2)+x*b+x. Din rezolvarea inegalitatii de gradul 2 se deduce baza maxima in care pot fi scrise numerele cautate. Apoi se considera toate numerele de forma ceruta scrise in toate bazele mai mici sau egale ca limita determinata.

38. Un sir de caractere contine doar litere mici ale alfabetului englez. Secventa palindromica este o succesiune de litere din sir cu proprietatea palindromica. Sa se determine cea mai lunga secventa palindromica dintr-un sir dat.date intrare: sirul de caracteredate iesire: pozitia de inceput a secventei palindromice si lungimea ei.de ex pentru sirul "anaareuncojocasafrumos" se va afisa 9 5.de la mijlocul secventei se fac comparatii ale elementelor simetrice. Se considera ambele situatii de lungime para/impara.int n,i,st,dr,r=0,start;char s[500];cin.getline(s,500); n=strlen(s);pt i=0,n-1{st=i;dr=i;while(st-1>-1) and ((dr+1<=n-1) and s[st-1]=s[dr+1] {st--;dr++;}if(r<dr-st+1) {r=dr-st+1; start=st;}st=i;dr=i+1;while(st-1>-1) and ((dr+1<=n-1) and s[st-1]=s[dr+1] {st--;dr++;}if(r<dr-st+1) {r=dr-st+1; start=st;}}cout<<start<<r;

39. Pentru un sir de n numere sa se determine secventa a carei suma a elementelor este minima in modul.de ex pentru n=3 si sirul de numere 2,-3,4 se va afisa 1.

Page 28: Pregătire olimpiadă

se construieste vectorul sumelor partiale s[i]=a[1]+a[2]+...+a[i] si se sorteaza. Apoi se iau elementele adiacente din vectorul sortat si se actualizeaza solutia.int n,i,j,t,r,a[100],s[100]={0};cin>>n;pt i=1,n{ cin>>a[i]; s[i]=s[i-1]+a[i];} //sortare vectorul s crescatorr=abs(s[1]);pt i=1,n-1 if(r>abs(s[i+1]-s[i]) r=abs(s[i+1]-s[i]);cout<<r;

40. Piticii. n pitici stau in sir. Fiecare are pe cap o caciula rosie sau neagra. Se stie ca piticii cu caciula rosie spun adevarul iar cei cu caciula neagra mint .Fiecare pitic spune cite caciuli rosii sint in fata sa. Sa se determine culorile caciulilor.de ex pentru n=5 si perechile :3 24 12 25 31 0(reprezinta numarul piticului si cite caciuli rosii are in fata sa)se va afisa: RNNRNint n,i,r,poz,val,nr[20000];cin>>n;pt i=1,n {cin>>poz>>val; nr[poz]=val;}r=0;pt i=1,n{ if(nr[i]==r) {cout<<'R'; r++;} else cout<<'N';}41. Gigel are n cutii cu bile rosii,verzi,albastre. Doreste sa le mute in 3 cutii, fiecare cutie sa contina doar bile de o anumita culoare, prin cit mai putine mutari.date intrare :n si 3 vectori r[i],v[i],a[i] - numarul de bile rosii,verzi,albastre din cutia i ( i=1..n).date iesire:numarul de bile mutatenumerele cutiilor (indicii) in care ajung bilele rosii,verzi si albastre .de ex pentrun=33 0 11 2 20 5 0se va afisa:41 3 2

Page 29: Pregătire olimpiadă

Se sorteaza vectorii r,v,a descrescator si se incearca toate cele pow(3,3,) posibilitati de a aduna fiecare tip de bila in primele 3 cutii ca marime.

42.Se considera n puncte in plan. Unele dintre ele sint dominante altele nu. Un punct este dominant daca punctele din dreapta lui (au coordonatele x >= coordonata x a punctului) au coordonata y mai mica decit coordonata y a punctului respectiv . Sa se determine cite din cele n puncte sint dominante.de ex pt n=3 si punctele:2 00 10 2se va afisa 2.Se sorteaza punctele descrescator dupa x, iar apoi pentru punctele ce au coordonata x egala se sorteaza descrescator dupa y. Se parcurg punctele si la fiecare pas se retine y-ul maxim intilnit, astfel incit sa se determine daca punctul curent este sau nu dominant.int n,i,j,t,maxy,nr;struct punct{int x;int y;} p[10000];cin>>n;pt i=1,n cin>>p[i].x>>p[i].y;//sortare dupa x descrescator, si apoi pt x egal dupa y descrescatornr=0; maxy=-inf ; // o valoarea f f micapt i=1,n{ if(p[i].y>maxy) {nr++; maxy=p[i].y;}}cout<<nr;43. Se considera un sir de n numere pozitive. Sa se inmulteasca o parte dintre ele cu -1 astfel incit adunate toate cele n numere sa rezulte un numar cit mai apropiat de 0 ,pozitiv. ( poate fi chiar 0). sa se determine aceasta suma.de ex pt n=3 si numerele 2 3 5 se va afisa 0.se construieste vectorul k[i]=1, daca se paote obtine suma i cu elementele din vector cu i intre -10000 si 10000. Se cauta apoi o valoare pt care k[i]=1 iar abs(i,suma elementelor -i) este minimaint n,s,i,j,r,a; bool k[-10000..10000];cin n;pt i=1,n {cin a[i]; s+=a[i];}k[a[1]]=1;pt i=2,n{ if (a[i]<0) pt j=-10000,10000 if(k[j] and j+a[i]>=0) k[j+a[i]]=1; if(a[i]>0) pt j=-10000,10000 if(k[j] and j+a[i]<=10000) k[j+a[i]]=1;

Page 30: Pregătire olimpiadă

}r=infint;pt i=0,s if (k[i] and r>abs(2*i-s)) r=abs(2*i-s);cout<<r;44.Un soricel tb sa parcurga un perimetru nxm de camarute patrate, pornind din coltul (1,1) si sa ajunga in coltul (n,m) , trecind prin camarute, si mincind minarea din acestea astfel incit sa manince cit mai mult. Soricelul nu intra in camarutele care nu au hrana. sa se determine care este cantitatea maxima de hrana pe care o poate minca si traseul urmat.de ex pt: n=2, m=4 si hrana:1 2 6 33 4 1 2se va afisa :7 21 (numarul de camarute vizitate si cantitatea maxima de hrana mincata)1 1 (indicii camarutelor)2 12 21 21 31 42 4cind una din laturi este nr impar se poate parcurge intreaga tabla in zigzag. Cind ambele laturi sint pare se coloreaza tabla ca una de sah ( patratul 1,1, este alb) si se alege minimul dintre patratele negre. Acela va fi ocolit. In rest se va trece prin toate patratele.

sectiunea - siruri de caractere1. pentru un sir de caractere sa se identifice o secventa de lungime maxima care este formata doar din caractere cifra.de ex pentru 45frtHg32040g4frt567 se va afisa 32040char s[200];int i,n,max=0,poz;cin.getline(s,200); strcat(s," ");n=0;for(i=1;i<strlen(s);i++) if(s[i]>='0' && s[i]<='9') n++; else { if(max<n) {max=n;poz=i-n;} n=0; }for(i=poz;i<poz+max;i++) cout<<s[i];

2. Un sir contine n cuvinte. sa se determine multimea cu numar maxim de cuvinte ce sint anagrame 2 cite 2. Pentru

multimea respectiva se va afisa cardinalul ei si un element component considerat a fi cel mai reprezentativ.de ex pentru n=6 si cuvintele "arc rac voi car rama arma" se va afisa 3 arc.char a[100][20],x[20],y[20], *p,cuv[20];

Page 31: Pregătire olimpiadă

int nr,n,i,j,k,max,poz;cin>>n; max=0;for(i=0;i<=n-1;i++) cin>>a[i];for(i=0;i<=n-2;i++) for(nr=1,,j=i+1;j<=n-1;j++) { strcpy(x,a[i]); strcpy(y,a[j]); if(strlen(x)==strlen(y)) { while(strchr(y,x[0])!=NULL && x[0]!=0) { p=strchr(y,x[0]); strcpy(p,p+1); strcpy(x,x+1);} if(x[0]==0 && y[0]==0) nr++; } if(max<nr) { max=nr; strcpy(cuv,a[i]); } }cout<<max<<' '<<cuv;3. Fisierul in.txt contine pe mai multe linii numere intregi. Orice caracter diferit de caracterele-cifra este considerat

separator. Sa se determine si sa se afiseze in fisierul out.txt media aritmetica a numerelor de pe fiecare linie.

de ex, pentru in.txt:2..3 118un2..2A,..81.92se va afisa in out.txt:41446.5

4.Un cuvint de maxim 50 de caractere este format doar din litere ale alfabetului englez. Sa se insereze minuscula minima

dpdv lexicografic ( ce apartine cuvintului) intre oricare doua litere identice aflate pe pozitii alaturate. Nu se va face distinctie

intre literele mari/mici.de exemplu pentru textul "inNorat" se va afisa "inaNorat".5. Fisierul program.txt contine pe mai multe linii un algoritm reprezentat in pseudocod. Singurele cuvinte cheie utilizate in

algoritm sint: intreg,daca,atunci,altfel.citeste,scrie,stop. Sa se determine numarul de variabile folosite in algoritm si

identificatorii acestora. Liniile din fisier se termina cu caracterul ';'.de ex pentru "daca a>b atunci x1=c altfel d=a+b stop;" se va afisa:5

Page 32: Pregătire olimpiadă

abx1cd6. Un sir de forma " eu masa noi vine" sa se afiseze astfel: a e s i nu a o ie m n v

7. Pentru un sir de caractere sa se determine cea mai lunga secventa de caractere care se repeta de minim 2 ori in cadrul

sirului. De ex pentru sirul: "maresecterasmasecbor" se va afisa "sec".

8.Pentru un sir de caractere sa se determine si sa se afiseze cea mai lunga secventa de caractere ordonata lexicografic.

daca exista mai multe se vor afisa toate. De ex pentru sirul "abcademia" se va afisa abc, aed

------------Se citeste o matrice nXm care contine litere mici si apoi un cuvant s. Gasiti cel mai lung prefix al cuvantului s care se poate construi cu literele din matrice prin deplasare paralela cu liniile si coloanele matricii fara a trece de doua ori prin aceeasi litera.Exemplu:5 6axsadsaanamannaairasdydisedrftanamarianaprefixul este anamaria