Documente Academic
Documente Profesional
Documente Cultură
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
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>
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>
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ță
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;
Pentru a putea folosi un vector caracteristic trebui îndeplinite (cel puțin) următoarele condiții:
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.)
#include<fstream>
using namespace std;
ifstream f("eratostene.in");
ofstream g("eratostene.out");
Temă:
#244, #1005, #264, #2702, #525, #267, #529, #239 și de concurs : #2296, #1145, #2177, #1061