Sunteți pe pagina 1din 17

Curs 13 ian 2023

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;

int a[35], n, b[25], m, k = 0, c[60];


void citire()
{
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
cin>>m;
for(int i=0; i<m; i++)
cin>>b[i];
}

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;
}

Se dau 2 multimi cu n respectiv m numere natural, 1<n<45 si 3<m<29.


Sa se formeze o a 3-a multime cu valorile care sunt commune.
#3974
#include <iostream>
#include <algorithm>
using namespace std;

int a[200005], b[200005], n, m;


char c;
void citire()
{

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.

/**
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;

int a[35], n, b[25], m, k = 0, c[60];


void citire()
{
cin>>n;
for(int i=0; i<n; i++)
cin>>a[i];
cin>>m;
for(int i=0; i<m; i++)
cin>>b[i];
}

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;

int a[200005], b[200005], n, m;


char c;
void citire()
{

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;
}

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