Sunteți pe pagina 1din 14

Recapitulare

Vectori
Aplicatii avansate ale vectorilor
Verificarea temei
1. https://infoarena.ro/problema/prim

Logic de rezolvare:
- se construieste ciurul pentru 1300000 numere → vectorul va avea 13000001
- se va afisa al k+1-lea numar prim la puterea a doua (atentie la tipul de date)
In C++ i = 1;
while (k >= 0) {
#include <fstream> i++;
if (v[i] == 0) {
using namespace std; k--;
char v[1300001]; }
int main() }
{ fout.open("prim.out");
ifstream fin; fout<<(long long)i*i;
ofstream fout; fout.close();
return 0;
int i,d,k; }

fin.open("prim.in");
fin>>k;
fin.close();

for (i = 2; i*i <= 1300000; i++) {


if (v[i] == 0) {
for (d = i * i; d <= 1300000; d = d + i) {
v[d] = 1;
}
}
}
Verificarea temei
2. http://varena.ro/problema/extraprime

Logic de rezolvare:
-
In C++ nrep = 0;
for (i = a; i <= b; i++) {
#include <fstream> if (v[i] == 0) {
p10 = 1;
using namespace std; d = i;
char v[10000001]; while (v[d] == 0 && p10 < i*100) {
int main() d = (i/(p10*10))*p10 + i%p10;
{ p10 = p10*10;
ifstream fin; }
ofstream fout; if (v[d] == 0) {
nrep++;
int i,d,a,b,nrep,epmin,epmax,p10; if (nrep == 1) {
epmin = d;
fin.open("extraprime.in"); }
fin>>a>>b; epmax = d;
fin.close(); }
}
v[0] = v[1] = 1; }
for (i = 2; i*i <= 10000000; i++) { fout.open("extraprime.out");
if (v[i] == 0) { fout<<nrep<<endl<<epmin<<endl<<epmax;
for (d = i * i; d <= 10000000; d = d + i) { fout.close();
v[d] = 1; return 0;
} }
}
}
Exercitii
1. Lui Ion ii place foarte mult sa scrie numere pe hartie. In fiecare zi, el scrie cate 5 de numere pe cate o
foaie diferita. Dupa un anumit numar de zile se decide ca ar vrea sa stie care sunt numerele distincte pe
care le-a scris pana atunci. In plus, vrea sa afle si ce numar a fost scris de cele mai multe ori (in cazul
in care sunt mai multe numere de acest tip, ar vrea sa stie care este cel mai mare).
Ajutati-l pe Ion sa isi rezolve dilema.

Date de intrare: n (numarul de zile), a1, a2, … numerele scrise de Ion pe hartii (va scrie n*5 numere dupa n
zile)
Date de iesire:
- pe prima linie numerele distincte scrise de Ion (cu cate un spatiu intre ele);
- pe a doua linie numarul maxim care apare de cele mai multe ori si numarul de aparitii (cele doua se vor
afisa cu un spatiu intre ele).
Restrictii:
- 1 <= n <= 20.000
- 1 <= ai <= 2.000.000

nrdist.in: nrdist.out
2 3 1 2 4 7
3 1 2 2 3 4 1 3 7 1 3 3
In c++ fout.open("nrdist.out");
mx = 0;
for (i = 1; i <= 2000000; i++) {
#include <fstream> if (v[i] != 0) {
using namespace std; fout<<i<<" ";
if (mx <= v[i]) {
int v[2000001]; mx = v[i];
mxi = i;
int main() }
{ }
ifstream fin; }
ofstream fout; fout<<endl<<mxi<<" "<<mx;
fout.close();
int n,i,x,mx,mxi;
return 0;
fin.open("nrdist.in"); }
fin>>n;
for (i = 0; i < 5*n; i++) {
fin>>x;
v[x]++;
}
fin.close();
Exercitii
2. Alina si Bianca se joaca un joc cu cifre. Alina scrie o secventa de cifre si ii spune Biancai numarul de
cifre scrise, n, si un nou numar, m, mai mic sau egal decat jumatatea lui n. Bianca apoi incepe si scrie m
cifre. Jocul este castigat de Alina daca secventa de cifre scrise de Bianca nu se regaseste in secventa
scrisa de ea, altfel, jocul este castigat de Bianca. Sa aflam castigatoarea!

Date de intrare:
- pe prima linie numerele n si m
- pe a doua linie lista de cifre scrise de Alina
- pe a treia linie lista de cifre scrise de Bianca
Date de iesire:
- pe prima linie se afiseaza Alina / Bianca in functie de cine a castigat
- pe a doua linie se afiseaza numarul de aparitii a scventei scrise de Bianca in secventa scrisa de Alina
Restrictii:
- 15 <= n <= 100.000; 1<= m <= n/2

joccf.in: joccf.out
15 4 Bianca
1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 2
1 2 3 4
In c++ secv = 0;
for (i = 0; i <= n-m; i++) {
nr = 0;
#include <fstream> for (j = 0; j < m; j++) {
using namespace std; if (a[i+j] == b[j]) {
int a[100000], b[50000]; nr++;
int main() }
{ }
ifstream fin; if (nr == m) {
ofstream fout; secv++;
}
int n,m,i,j,secv,nr; }

fin.open("joccf.in"); fout.open("joccf.out");
fin>>n>>m; if (secv == 0) {
for (i = 0; i < n; i++) { fout<<"Alina";
fin>>a[i]; }
} else {
for (i = 0; i < m; i++) { fout<<"Bianca";
fin>>b[i]; }
} fout<<endl<<secv;
fin.close(); fout.close();

return 0;
}
Tema
1. https://infoarena.ro/problema/cmmdc2

Idee de rezolvare:
- se folosesc doi vectori:
- un vector de frecventa pentru cele n elemente citite
- un vector de tip ciur care va retine numarul de multiplii pe care ii care un indice i in vector
citit initial.

Pentru exemplul din problema (n = 6, k = 3 si vectorul 6 9 8 10 15 3) cei doi vectori vor arata astfel:

frecv = [0 0 1 0 0 1 0 1 1 1 0 0 0 0 1 0 ..] → un vector cu maxim 1.000.001 elemente


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ..

ciur = [0 3 4 1 2 0 0 1 1 1 0 0 0 0 1 .. ] → un vector cu maxim 1.000.001 elemente


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ..

si observam ca:
● ciur[2] = 3 → exista 3 numere citite initial care il au ca divizor pe 2 (deci putem forma o grupare de
3 elemente pt care cmmdc este 2)
● ciur[3] = 4 → exista 4 numere citite initial care il au ca divizor pe 3 (deci putem forma o grupare de
4 elemente pt care cmmdc este 3)
● etc.
In C++
Tema
2. Gigel are o panglica alcatuita din benzi de 1 cm latime, colorate in diverse culori. Panglica are N benzi
colorate cu C culori, culori pe care le vom numerota de la 1 la C. Gigel vrea ca la ambele capete ale
panglicii sa aiba aceeasi culoare, dar cum nu poate schimba culorile benzilor, singura posibilitate ramane
taierea unor bucati de la capete.
Cerinta: Scrieti un program care sa determine modul de taiere a panglicii astfel incat la cele doua capete
sa fie benzi de aceeasi culoare, iar lungimea panglicii obtinute sa fie maxima.
Date de intrare: Fisierul de intrare panglica.in conţine:
● pe prima linie numerele naturale N si C separate printr-un spatiu;
● pe urmatoarele N linii descrierea panglicii: pe fiecare linie un numar natural de la 1 la C,
reprezentand in ordine culorile fasiilor ce alcatuiesc panglica.
Date de ieşire: Fişierul de ieşire panglica.out va conţine următoarele 4 numere:
● pe prima linie numarul de fasii ramase
● pe linia a doua numarul culorii care se afla la capete
● pe linia a treia cate fasii trebuie taiate de la inceputul panglicii initiale
● pe linia a patra cate fasii trebuie taiate de la sfarsitul panglicii initiale
Restrictii
● 2 ≤ N ≤ 10000
● 1 ≤ C ≤ 200
Daca exista mai multe solutii alegeti pe cea in care se taie cat mai putin din partea de inceput a
panglicii.
Tema
Exemple:

panglica.in: panglica.out:
6 3 4
1 2
2 1
1 1
3
2
3

panglica.in: panglica.out:
5 2 4
1 2
2 1
1 0
2
2
In c++

S-ar putea să vă placă și