Documente Academic
Documente Profesional
Documente Cultură
Operatii cu multimi
1. Multime
2. Reuniunea
3. Intersectia
4. Diferenta
an, 2<n<30
bm, 1<m<20
ck = Reuniunea a 2 multimi an, bm
- Copiez elementele cu proprietatea din multimea a in multimea ck
- Memorez elem cu prop din b in c care nu sunt deja
Sa se realizeze reuniunea elementelor impare din an sib m multimi (au
elem distincte)
///reuniunea elem impare
#include <iostream>
using namespace std;
void reuniune()
{
///copiez imparele din a in c
for(int i=0; i<n; i++)
if(a[i] % 2 == 1)
c[k++] = a[i];
///copiez b-urile impare care nu sunt deja in c
for(int i=0; i<m; i++)
if(b[i] % 2 == 1)
{
int ok = 1;///pp ca bi nu-i in a
for(int j=0; j<n && ok == 1; j++)
if(b[i] == a[j])
ok = 0;
if(ok == 1)
c[k++] = b[i];
}
}
void afisare()
{
cout<<"reuniune:";
for(int i=0; i<k; i++)
cout<<c[i]<<" ";
}
int main()
{
citire();
reuniune();
afisare();
return 0;
}
cin>>n>>m>>c;
for(int i=0; i<n; i++)
cin>>a[i];
sort(a+0, a+n);
for(int i=0; i<m; i++)
cin>>b[i];
sort(b+0, b+m);
}
void reuniune()
{
for(int i=0; i<n; i++)
cout<<a[i]<<" ";
for(int i=0; i<m; i++)
{
bool ok = 0;
for(int j=0; j<n && !ok; j++)
if(b[i] == a[j])
ok = 1;
if(!ok)
cout<<b[i]<<" ";
}
}
void intersectie()
{
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
if(a[i]==b[j])
{
cout<<a[i]<<" ";
break;
}
}
void difa_b()
{
for(int i=0; i<n; i++)
{
bool ok = 0;
for(int j=0; j<m && !ok; j++)
if(b[i] == a[j])
ok = 1;
if(!ok)
cout<<a[i]<<" ";
}
}
void dif_simetrica()
{
for(int i=0; i<n; i++)
{
bool ok = 0;
for(int j=0; j<m && !ok; j++)
if(a[i] == b[j])
ok = 1;
if(!ok)
cout<<a[i]<<" ";
}
for(int i=0; i<m; i++)
{
bool ok = 0;
for(int j=0; j<n && !ok; j++)
if(b[i] == a[j])
ok = 1;
if(!ok)
cout<<b[i]<<" ";
}
}
void prelucrare()
{
if(c == '+')
{
reuniune();
return;
}
if(c == '*')
{
intersectie();
return;
}
if(c == '-')
{
difa_b();
return;
}
if(c == '%')
{
dif_simetrica();
return;
}
}
void prelucrare2()
{
switch(c)
{
case'+':
{
reuniune();
break;
}
case'*':
{
intersectie();
break;
}
case'-':
{
difa_b();
break;
}
case'%':
{
dif_simetrica();
break;
}
}
}
int main()
{
citire();
prelucrare();
return 0;
}
A-B
DIFERENTA SIMETRICA
INTERCLASARE
-se aplica pe vectori sortati crescator respectiv descrescator
/**
Se dau an si bm cu valori ordonate crescator.
Sa se formeze un nou vector cu valorile,
ordonate crescator,
care se gasesc fie in primul vector,
fie in al 2lea vector, fie in ambele tablouri.
an, bm ord cresc===> ck ord cresc
considerate o singura data
n=5
2 5 8 10 12
i
m=9
3 5 8 9 10 11 12 20 23
j
k=9
c = (2 3 5 8 9 10 11 12 20 23
012345 6 7 8 9
**/
#include <iostream>
using namespace std;
void interclasare()
{
int i=0, j = 0;
while(i < n && j < m)
if(a[i] == b[j])
c[k++] = a[i], i++, j++;
else if(a[i] < b[j])
c[k++] = a[i++];///c[k] = a[i], k++, i++;
else if(a[i] > b[j])
c[k++] = b[j++];
while(i<n)
c[k++] = a[i++];
while(j<m)
c[k++] = b[j++];
}
void afisare()
{
for(int i=0; i<k; i++)
cout<<c[i]<<" ";
}
int main()
{
citire();
interclasare();
afisare();
return 0;
}
Rezolovare 100p
#include <iostream>
#include <algorithm>
using namespace std;
cin>>n>>m>>c;
for(int i=0; i<n; i++)
cin>>a[i];
sort(a+0, a+n);
for(int i=0; i<m; i++)
cin>>b[i];
sort(b+0, b+m);
}
void reuniune()
{
int i=0, j=0;
while(i<n && j <m)
if(a[i] == b[j])
{
cout<<a[i]<<" ";
i++;
j++;
}
else if(a[i] < b[j])
{
cout<<a[i]<<" ";
i++;
}
else
{
cout<<b[j]<<" ";
j++;
}
while(i<n)
{
cout<<a[i]<<" ";
i++;
}
while(j<m)
{
cout<<b[j]<<" ";
j++;
}
}
void intersectie()
{
int i=0, j = 0;
while(i<n && j<m)
if(a[i] == b[j])
{
cout<<a[i]<<" ";
i++;
j++;
}
else if(a[i] < b[j])
i++;
else
j++;
}
///A - B
void difa_b()
{
int i=0, j =0;
while(i < n && j < m)
if(a[i] == b[j])
i++, j++;
else if(a[i] < b[j])
{
cout<<a[i]<<" ";
i++;
}
else if(a[i] > b[j])
j++;
while(i<n)
{
cout<<a[i]<<" ";
i++;
}
}
///(A - B) U (B - A)
void dif_simetrica()
{
int i = 0, j = 0;
while(i < n && j < m)
if(a[i] == b[j])
i++, j++;
else if(a[i] < b[j])
{
cout<<a[i]<<" ";
i++;
}
else if(a[i] > b[j])
{
cout<<b[j]<<" ";
j++;
}
while(i < n)
{
cout<<a[i]<<" ";
i++;
}
while(j < m)
{
cout<<b[j]<<" ";
j++;
}
}
void prelucrare()
{
if(c == '+')
{
reuniune();
return;
}
if(c == '*')
{
intersectie();
return;
}
if(c == '-')
{
difa_b();
return;
}
if(c == '%')
{
dif_simetrica();
return;
}
void prelucrare2()
{
switch(c)
{
case'+':
{
reuniune();
break;
}
case'*':
{
intersectie();
break;
}
case'-':
{
difa_b();
break;
}
case'%':
{
dif_simetrica();
break;
}
}
}
int main()
{
citire();
prelucrare2();
return 0;
}
CAUTARE BINARA
- Se aplica pe vectori sortati crescator sau descrescator
- Se da vector an, sortat crescator si x nr nat. Afisati
pe ce pozitie se afla x in vector.
https://www.pbinfo.ro/probleme/2644/clase
100p
#include <fstream>
using namespace std;
long long a[10005];
int n;
ifstream cin("clase.in");
ofstream cout("clase.out");
int cautBin(long long a[], int n, long long x)
{
int s = 0, d = n-1;
while(s <= d)
{
int mij = (s + d)/2;
if(a[mij] == x)
return mij;
else if(a[mij] < x)
s = mij + 1;
else if(a[mij] > x)
d = mij -1;
}
return -1;
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
int nr = 0;
int m;
cin>>m;
for(int i=0; i<m; i++)
{
long long x;
cin>>x;
if(cautBin(a,n, x)!= -1)
nr++;
}
cout<<nr;
return 0;
}