Sunteți pe pagina 1din 8

Prof.

Mihaela Corina ILDEGEZ


Centru pentru pregătire pentru Performanță

Obiective:
Ordonarea folosind vectori de
Vectori de frecvență frecvență
Identificarea situațiilor în care trebuie
utilizați
Aplicarea și modificarea algoritmului
pentru rezolvarea problemelor

Cuprins:
Rezolvare temă ........................................................................................................................................ 1
Problema #2668 .................................................................................................................................. 1
Problema #241 .................................................................................................................................... 2
Problema #530 .................................................................................................................................... 3
Problema #284 .................................................................................................................................... 4
Problema #250 .................................................................................................................................... 5
Vector de frecvență ................................................................................................................................. 6
Vector caracteristic ............................................................................................................................. 6
Vector de frecvență ............................................................................................................................. 7
Ciurul lui Eratostene ............................................................................................................................ 7
Temă: ....................................................................................................................................................... 8

Rezolvare temă
Problema #2668
#include <iostream>
#include <algorithm>
using namespace std;
int a[100001], b[100001], c[200001],n;
int main()
{
int i, j, k=0, comun=-1;
cin>>n;
for(i=0; i<n; i++) ///citim elementele primului sir
cin>>a[i];
for(i=0; i<n; i++) ///citim elementele celui de al doilea sir
cin>>b[i];
i=j=0; ///interclasăm cele două siruri
while(i<n && j<n)
if(a[i]<b[j])
i++;
else if(a[i]>b[j])
j++;
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

else
c[k++]=a[i],i++,j++; ///luăm doar elementele comune

for(i=0; i<n; i++) ///citim al treilea șir


cin>>a[i];
bool gasit=0;
i=j=0; ///il interclasăm cu rezultatul de la
///primele două
while(i<n && j<k && !gasit)
if(a[i]<c[j])
i++;
else
if(a[i]>c[j])
j++;
else
gasit=1,comun=a[i];///pastram primul element comun celor 3
cout<<comun;
return 0;
}
Problema #241
#include <fstream>

using namespace std;


ifstream f("interclasare.in");
ofstream g("interclasare.out");

int main()
{
int n,m,i,j,k;
int a[100001], b[100001];
f>>n;
for(i=1; i<=n; i++)
f>>a[i];
f>>m;
for(i=1; i<=m; i++)
f>>b[i];
i=1;
j=1,k=0; ///interclasăm cei doi vectori,dar afisam direct rez
while(i<=n and j<=m)
{
k++; ///numaram cate valori am afisat
if(a[i]<b[j])
g<<a[i++]<<" ";
else
g<<b[j++]<<" ";
if(k%10==0) ///după 10 elemente trecem la rand nou
g<<endl;
}
while(i<=n)
{
k++;
g<<a[i++]<<" ";
if(k%10==0)
g<<endl;
}
while(j<=m)
{
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

k++;
g<<b[j++]<<" ";
if(k%10==0)
g<<endl;
}
return 0;
}

Problema #530
#include <iostream>
using namespace std;

int main()
{
int n,m,i,j,k;
int a[100001], b[100001];
cin>>n;
for(i=1; i<=n; i++)
cin>>a[i];
cin>>m;
for(i=1; i<=m; i++)
cin>>b[i];
///reuniunea: elemente comune si necomune luate o sigura dată
i=1;
j=1;
while(i<=n and j<=m)
if(a[i]<b[j])
cout<<a[i++]<<" ";
else
if(a[i]==b[j])
{ cout<<a[i]<<" ";
i++;
j++;
}
else
cout<<b[j++]<<" ";

while(i<=n)
cout<<a[i++]<<" ";

while(j<=m)
cout<<b[j++]<<" ";
cout<<endl;
///intersectia: doar elementele comune
i=1;
j=1;
while(i<=n and j<=m)
if(a[i]<b[j])
i++;
else
if(a[i]==b[j])
{ cout<<a[i]<<" ";
i++;
j++;
}
else
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

j++;
return 0;
}

Problema #284
#include <fstream>

using namespace std;


ifstream f("interclasare3.in");
ofstream g("interclasare3.out");

int main()
{
int n,m,i,j,k;
int a[100001], b[100001];
f>>n>>m;
for(i=1; i<=n; i++)
f>>a[i];
for(i=1; i<=m; i++)
f>>b[i];
///interclasăm doar elemntele pare din cei doi vectori si
///afisam cate 20 pe linie
i=1;
j=m,k=0;
while(i<=n and j>=1)
{

if(a[i]%2==0)
if(b[j]%2==0)
{
if(a[i]<b[j])
{k++;
g<<a[i++]<<" ";
}
else
{ k++;;
g<<b[j--]<<" ";
}
if(k%20==0)
g<<endl;
}
else
j--;
else
i++;

}
while(i<=n)
{ if(a[i]%2==0)
{k++;
g<<a[i++]<<" ";
if(k%20==0)
g<<endl;
}
else
i++;
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

}
while(j>=1)
{ if(b[j]%2==0)
{k++;
g<<b[j--]<<" ";
if(k%20==0)
g<<endl;
}
else
j--;
}
return 0;
}
Problema #250
#include <fstream>

using namespace std;


ifstream f("interclasare1.in");
ofstream g("interclasare1.out");

int main()
{
int n,m,i,j,k,x;
int a[100001], b[100001];
f>>n;
for(i=1; i<=n; i++)
f>>a[i];
f>>m;
for(i=1; i<=m; i++)
f>>b[i];
///interclasam vectorii DAR luam elemntele comune o singura data
i=1;
j=1,k=0;
while(i<=n and j<=m)
{
k++;
if(a[i]<=b[j])
{x=a[i];
g<<a[i]<<" ";
if(a[i]==b[j])///luam doar un element comun
{j++;i++;}
else
i++;
}
else
{
x=b[j];
g<<b[j++]<<" ";
}
if(k%10==0) ///afisam cate 10 pe linie
g<<endl;
}

while(i<=n)
if(a[i]!=x)
{ k++;
x=a[i];
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

g<<a[i++]<<" ";
if(k%10==0)
g<<endl;
}
else
i++;

while(j<=m)
if(b[j]!=x)
{
k++;
x=b[j];
g<<b[j++]<<" ";
if(k%10==0)
g<<endl;
}
else
j++;

return 0;
}
Rămân temă în continuare: Ușoare: #2276, medii: #251

Vector de frecvență
Considerăm următoarea problemă: Se dau două șiruri de cifre zecimale. Să se determine cifrele comune, în
ordine crescătoare.
În funcție de numărul de cifre din cele două șiruri, putem realiza diverse soluții:
 căutăm fiecare termen din primul șir în al doilea șir. Șirul cu valorile comune va trebui sortat.
 dacă șirurile sunt sortate (sau le sortăm) procedăm ca mai sus, dar căutăm binar. Șirul cu valorile
comune este de la început sortat.
 dacă șirurile sunt sortate (sau le sortăm) putem folosi interclasarea pentru a afla elementele comune.
Vector caracteristic
Nicio soluție dintre cele de mai sus nu ține cont de o proprietate a valorilor din șir – că sunt cifre, adică
între 0 și 9. Putem proceda astfel:
 pentru fiecare șir vom folosi un vector cu doar 10 elemente, indexate de la 0 la 9; fie acestea v[] și u[];
 indicii elementelor din șir reprezintă cifrele – valorile posibile ale elementelor din șir;
 inițial elementele celor doi vectori sunt 0;
 pentru fiecare valoare x (care este cifră) care apare în primul șir vom marca în vectorul v[] elementul
corespunzător cu 1, v[x] = 1;
 similar, fiecare element y din al doilea șir va fi marcat în vectorul u[] cu 1, u[y] = 1;
 la final sunt comune cifrele c (de la 0 la 9) care sunt marcate cu 1 atât în vectorul v[], cât și în
vectorul u[].
Cei doi vectori v[] și u[] sunt vectori caracteristici. Elementele lor caracterizează cifrele dintre 0 și 9, stabilind
despre fiecare cifră dacă face sau nu parte din șirul corespunzător.
Observăm că nu trebuie memorate elementele celor două șiruri date. Ne interesează numai valorile distincte
care apar în fiecare șir, indiferent de ordinea în care apar.

De exemplu: Daca cele două numere sunt: N=132245 și M=4326789 atunci vectorii caracteristici sunt:
a
0 1 2 3 4 5 6 7 8 9
0 1 1 1 1 1 0 0 0 0
b
0 1 2 3 4 5 6 7 8 9
0 0 1 1 1 0 1 1 1 1
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

Se observă ușor ca cifrele comune sunt 2,3 și 4.

Observații:

 vectorul caracteristic are dimensiune constantă – egală cu numărul de valori pe care le caracterizează;
 elementele vectorului caracteristic sunt 0 sau 1 (echivalent cu Adevărat și Fals); valorile din vectorul
caracteristic NU sunt valorile date;
 valorile date se află printre indicii vectorului caracteristic, respectiv indicii corespunzători elementelor
egale cu 1;

Când folosim vectorul caracteristic?

Pentru a putea folosi un vector caracteristic trebui îndeplinite (cel puțin) următoarele condiții:

 ordinea datelor de intrare nu contează


 datele de intrare au valori mici, sunt numere naturale dintr-un interval de forma [0,M] sau pot fi
echivalente cu astfel de numere
 practic, putem folosi un vector caracteristic dacă memoria disponibilă permite declararea unui vector
cu un număr de elemente corespunzător:
o dacă datele de intrare sunt din intervalul [0, 1000] sau [0,10000] putem folosi un vector
caracteristic
o dacă datele de intrare sunt din intervalul [0, 1 milion] putem folosi un vector caracteristic –
deși poate există metodă mai bună
o dacă datele de intrare sunt din intervalul [0, 1 miliard] NU putem folosi un vector caracteristic

Vector de frecvență
Să considerăm din nou un șir de cifre zecimale. Să se determine cifra care apare de cele mai multe ori.
Dacă sunt mai multe cifre care apar de număr maxim de ori, să se determine cea mai mică (sau cea mai mare,
sau toate, etc.)

De exemplu: Daca avem un număr: M=432266789 atunci vectorii caracteristici sunt:


fr
0 1 2 3 4 5 6 7 8 9
0 0 2 1 1 0 2 1 1 1

0, 𝑑𝑎𝑐𝑎 𝑐𝑖𝑓𝑟𝑎 𝑖 𝑁𝑈 𝑎𝑝𝑎𝑟𝑒 𝑖𝑛 𝑛𝑢𝑚ă𝑟 ̅̅̅̅


fr[i]={ oricare ar fi cifra i=0,9
𝑛𝑟. 𝑎𝑝𝑎𝑟𝑖𝑡𝑖𝑖, 𝑑𝑎𝑐𝑎 𝑐𝑖𝑓𝑟𝑎 𝑖 𝑎𝑝𝑎𝑟𝑒 î𝑛 𝑛𝑢𝑚ă𝑟

Ciurul lui Eratostene


Determinați numerele prime mai mici decât 1 000 000.(problemana #303)

#include<fstream>
using namespace std;

ifstream f("eratostene.in");
ofstream g("eratostene.out");

bool prim[1000010];///vector caracteristic


int main()
{
int i, j, n, x, cate=0;
prim[0]=prim[1]=1;
Prof. Mihaela Corina ILDEGEZ
Centru pentru pregătire pentru Performanță

Marcam cu 1 numere care NU for(i=2;i<=1000;i++)


sunt prime(multipli de numere if(prim[i]==0)
prime) for(j=i*i;j<=1000000;j=j+i)
Citim n prim[j]=1;
Determinam cate numere prime f>>n;
for(i=1;i<=n;i++)
sunt mai mici decât un număr
{
dat, fără a utiliza funcția prim
f>>x;
if(prim[x]==0)
cate++;
}
g<<cate;
return 0;
}

Temă:
#244, #1005, #264, #2702, #525, #267, #529, #239 și de concurs : #2296, #1145, #2177, #1061