Sunteți pe pagina 1din 17

#241 Interclasare

Cerinţa
Se dau două şiruri a şi b, cu n, respectiv m elemente, numere naturale, ordonate crescător.
Să se construiască un al treilea şir, c, care să conţină, în ordine crescătoare, elementele din
şirurile a şi b.

Date de intrare
Fişierul de intrare interclasare.in conţine pe prima linie numărul n; urmează n numere
naturale, ordonate crescător, ce pot fi dispuse pe mai multe linii. Linia următoare conţine
numărul m şi urmează m numere naturale, ordonate crescător, ce pot fi dispuse pe mai multe
linii.

Date de ieşire
Fişierul de ieşire interclasare.out va conţine elementele şirului construit, câte 10 valori
pe o linie, elementele de pe o linie fiind separate printr-un spaţiu. Ultima linie a fişierului
poate să conţină mai puţin de 10 valori.

Restricţii şi precizări
 1 ≤ n, m ≤ 100.000
 valorile elementelor celor două şiruri vor fi mai mici decât 1.000.000

Exemplu:
interclasare.in

7
1 3 4 6
7 8 8
8
2 4 5 6 8
9 9 12

interclasare.out

1 2 3 4 4 5 6 6 7 8
8 8 9 9 12

#include <fstream>

using namespace std;


ifstream cin("interclasare.in");
ofstream cout("interclasare.out");
int n,m,k,a[100001],b[100001],c[200001],i,j;
int main()
{
cin >> n;
for (i=1; i<=n; i++)
cin >> a[i];

cin >> m;
for (i=1; i<=m; i++)
cin >> b[i];

int i=1,j=1;
while (i<=n && j<=m)
if (a[i]<b[j])
c[++k]=a[i],i++;
else
c[++k]=b[j],j++;

while (i<=n)
c[++k]=a[i],i++;

while (j<=m)
c[++k]=b[j],j++;

for (i=1; i<=k; i++)


{
cout << c[i] << " ";
if (i%10==0)
cout << endl;
}
return 0;
}
#250 Interclasare1
Cerinţa
Se dau două şiruri a şi b, cu n, respectiv m elemente, numere naturale, ordonate strict
crescător. Să se afişeze, în ordine strict crescătoare, valorile existente în cel puţin unul dintre
cele două şiruri. În cazul în care o valoare apare în ambele şiruri, va fi afişată o singură dată.

Date de intrare
Fişierul de intrare interclasare1.in conţine pe prima linie numărul n; urmează n numere
naturale, ordonate strict crescător, ce pot fi dispuse pe mai multe linii. Linia următoare
conţine numărul m şi urmează m numere naturale, ordonate strict crescător, ce pot fi dispuse
pe mai multe linii.

Date de ieşire
Fişierul de ieşire interclasare1.out va conţine, în ordine strict crescătoare, valorile
existente în cel puţin unul dintre cele două şiruri. Aceste valori vor fi afişate câte 10 pe o
linie, separate prin spaţii. Ultima linie poate conţine mai puţin de 10 de valori.

Restricţii şi precizări
 1 ≤ n,m ≤ 100.000
 valorile elementelor celor două şiruri vor fi mai mici decât 1.000.000

Exemplu:
interclasare1.in

7
1 3 4
7 20 24 60
9
3 5 7
8 9 10 12
20 24

interclasare1.out
1 3 4 5 7 8 9 10 12 20
24 60

#include <fstream>

using namespace std;


ifstream cin ("interclasare1.in");
ofstream cout ("interclasare1.out");
int n,m,a[100001],b[100001],c[200001],k,i,j;
int main()
{
cin >> n;
for (i=1; i<=n; i++)
cin >> a[i];

cin >> m;
for (i=1; i<=m; i++)
cin >> b[i];

i = 1, j = 1;
while (i<=n && j<=m)
if (a[i]<b[j])
c[++k]=a[i],i++;
else
if (a[i]>b[j])
c[++k]=b[j],j++;
else
i++; //deci a[i]==b[j]deci doar sar peste nr de pe poz trecand la urm poz

while (i<=n)
c[++k]=a[i],i++;

while (j<=m)
c[++k]=b[j],j++;

for (i=1; i<=k; i++)


{
cout << c[i] << " ";
if (i%10==0)
cout << endl;
}
return 0;
}

#251 Interclasare2
Cerinţa
Se dau două şiruri a şi b, cu n, respectiv m elemente, numere naturale, ordonate strict
crescător. Să se afişeze, în ordine strict crescătoare, valorile existente în ambele şiruri.

Date de intrare
Fişierul de intrare interclasare2.in conţine pe prima linie numărul n; urmează n numere
naturale, ordonate strict crescător, ce pot fi dispuse pe mai multe linii. Linia următoare
conţine numărul m şi urmează m numere naturale, ordonate strict crescător, ce pot fi dispuse
pe mai multe linii.

Date de ieşire
Fişierul de ieşire interclasare2.out va conţine, în ordine strict crescătoare, valorile
existente în ambele şiruri. Aceste valori vor fi afişate câte 10 pe o linie, separate prin spaţii.
Ultima linie poate conţine mai puţin de 10 de valori.

Restricţii şi precizări
 1 ≤ n,m ≤ 100.000
 valorile elementelor celor două şiruri vor fi mai mici decât 1.000.000

Exemplu:
interclasare2.in

7
1 3 4
7 20 24 60
9
3 5 7
8 9 10 12
20 24

interclasare2.out

3 7 20 24
#include <fstream>

using namespace std;


ifstream f ("interclasare2.in");
ofstream g ("interclasare2.out");
int a[100001],b[100001],c[100001],n,m,k,i,j;
int main()
{
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;

while (i<=n && j<=m)


if (a[i]==b[j])
c[++k]=a[i],i++,j++;
else
if (a[i]>b[j])
j++;
else
i++;

for (i=1;i<=k;i++)
{
g << c[i] << " ";
if (i%10==0)
g << endl;
}
return 0;
}
#284 Interclasare3
Cerinţa
Se dau două şiruri, cu n, respectiv m, elemente, numere naturale. Primul şir este ordonat
crescător, iar al doilea este ordonat descrescător. Să se afişeze, în ordine crescătoare, valorile
pare din cele două şiruri.

Date de intrare
Fişierul de intrare interclasare3.in conţine pe prima linie numerele n şi m;
urmează n numere naturale separate prin spaţii, dispuse pe mai multe linii, ordonate
crescător; urmează m numere naturale separate prin spaţii, dispuse pe mai multe linii,
ordonate descrescător.

Date de ieşire
Fişierul de ieşire interclasare3.out va conţine valorile pare din cele două şiruri, ordonate
crescător, câte 20 de valori pe o linie, valorile de pe aceeaşi linie fiind separate printr-un
spaţiu.

Restricţii şi precizări
 1 ≤ n,m ≤ 100000;
 elementele celor două şiruri vor avea cel mult 9 cifre;
 în cel puţin şir va exista minim un element par;

Exemplu:
interclasare3.in

5 8
2 4 7 37 42
88 88 67 45 42 32 4 1

interclasare3.out

2 4 4 32 42 42 88 88
#include <fstream>

using namespace std;


ifstream fin ("interclasare3.in");
ofstream fout ("interclasare3.out");
int a[100001],b[100001],c[200001],i,j,k,x,p,q,n,m;
int main()
{
fin >> n >> m;
p=0; //se iau doar valorile pare din vectori
for (i=1;i<=n;i++)
{
fin >> x;
if (x%2==0)
p++,a[p]=x;
}
q=0;
for (i=1;i<=m;i++)
{
fin >> x;
if (x%2==0)
q++,b[q]=x;
}
i=1;//zice ca e ord cresc
j=q; //adica de la ultimul ptc zice ord descr
while (i<=p && j>=1)
if (a[i]<b[j])
c[++k]=a[i],i++;
else
c[++k]=b[j],j--;
while (i<=p)
c[++k]=a[i],i++;
while (j>=1)
c[++k]=b[j],j--;
for (i=1;i<=k;i++)
{
fout << c[i] << " ";
if (i%20==0)
fout << endl;
}
return 0;
}
#530 Multimi1
Cerința
Se dau două mulțimi de numere naturale. Să se afișeze reuniunea și intersecția lor.

Date de intrare
Programul citește de la tastatură, în ordine:

 numărul n de elemente ale primei mulțimi


 n numere naturale diferite, ordonate crescător, reprezentând elementele primei
mulțimi
 numărul m de elemente ale celei de-a doua mulțimi
 m numere naturale diferite, ordonate crescător, reprezentând elementele celei de-a
doua mulțimi

Date de ieșire
Programul va afișa pe ecran elementele reuniunii celor două mulțimi, în ordine
crescătoare, separate prin exact un spațiu, iar pe rândul următor elementele intersecției celor
două mulțimi, în ordine crescătoare, separate de asemenea prin exact un spațiu.

Restricții și precizări
 1 ≤ n , m ≤ 100.000
 elementele celor două mulțimi vor fi mai mici decât 1.000.000.000
 cele două mulțimi date au cel puțin un element comun

Exemplu:
Intrare

5
3 6 8 9 12
7
2 5 6 7 8 9 11

Ieșire

2 3 5 6 7 8 9 11 12
6 8 9
#include <iostream>

using namespace std;


int a[100001],b[100001],c[200001],d[100001],m,n,i,j,e,k;
int main()
{
cin >> n;
for (i=1; i<=n; i++)
cin >> a[i];
cin >> m;
for (i=1; i<=m; i++)
cin >> b[i];
i=1,j=1;
e=0;//pt vectorul nou
while (i<=n && j<=m)
if (a[i]<b[j])
c[++k]=a[i],i++;
else if (a[i]>b[j])
c[++k]=b[j],j++;
else
e++,d[e]=a[i],c[++k]=a[i],i++,j++;

while (i<=n)
c[++k]=a[i],i++;
while (j<=m)
c[++k]=b[j],j++;

for (i=1; i<=k; i++)


cout << c[i] << " ";
cout << endl;
for (i=1; i<=e; i++)
cout << d[i] << " ";
return 0; }
#3824 Perechi6
Cerința
Se dau două șiruri de numere întregi, ordonate crescător.
Ș irul x[] contine n numere întregi ordonate crescător,
șirul y[] conține m numere întregi ordonate crescător. Să se calculeze
numărul de perechi de forma (x[i], y[j]) unde x[i] = y[j] și x[i] ∊
X, respectiv y[j] ∊ Y.

Date de intrare
Fișierul de intrare perechi6.in conține pe prima linie numărul
natural n, urmat de cele n elemente ale șirului x[], separate prin câte
un spațiu. Pe a două linie numărul natural m, urmat de cele m elemente
ale șirului y[], separate prin câte un spațiu.

Date de ieșire
Fișierul de ieșire perechi6.out va conține pe prima linie numărul p,
reprezentând numărul de perechi de elemente cerut.

Restricții și precizări
 1 ≤ n, m ≤ 100.000
 -1.000.000.000 ≤ x[i], y[j] ≤ 1.000.000.000

Exemplu:
perechi6.in

5 1 2 3 4 5
6 1 2 2 3 3 4

perechi6.out

6
Explicație
În fișierul de intrare sunt 6 perechi de numere care îndeplinesc
condițiile din enunț: (1,1), (2,2), (2,2), (3,3), (3,3), (4,4).

#include <fstream>

using namespace std;


ifstream cin ("perechi6.in");
ofstream cout ("perechi6.out");
int n,m,i,j,a[100001],b[100001];
long long k,p,q;
int main()
{
cin >> n;
for (i=1;i<=n;i++)
cin>>a[i];

cin >> m;
for (j=1;j<=m;j++)
cin >> b[j];

i=1,j=1;
k=0;
while (i<=n && j<=m)
if (a[i]<b[j])
i++;
else
if (a[i]>b[j])
j++;
else
{
p=q=1;
while (i<n && a[i]==a[i+1])
p++,i++;
i++;
while (j<m && b[j]==b[j+1])
q++,j++;
j++;
k+=p*q;
}
cout << k;
return 0;
}

#242 InterclasM
Cerința
Se dă un număr natural x și două șiruri a și b, cu n, respectiv m elemente, numere
naturale, ordonate strict crescător. Să se afișeze, în ordine crescătoare, multiplii lui x care
se află doar în unul dintre cele două șiruri.

Date de intrare
Fișierul de intrare interclasm.in conține pe prima linie numărul x, pe linia a doua
numărul n; urmează n numere naturale, ordonate crescător, ce pot fi dispuse pe mai multe
linii. Linia următoare conține numărul m și urmează m numere naturale, ordonate crescător, ce
pot fi dispuse pe mai multe linii.

Date de ieșire
Fișierul de ieșire interclasm.out va conține pe prima linie valorile determinate, separate
printr-un spațiu.

Restricții și precizări
 0 < x < 1.000.000
 1 ≤ n, m ≤ 100.000
 valorile elementelor celor două șiruri vor fi mai mici decât 1.000.000

Exemplu:
interclasm.in

5
7
1 2 3 4
7 20 60
9
3 5 7
8 9 10 12
20 24

interclasm.out

5 10 60

#include <fstream>

using namespace std;


ifstream fin ("interclasm.in");
ofstream fout ("interclasm.out");
int a[100001],b[100001],c[200001],k,i,j,m,n,x,p,q,nr;
int main()
{
fin >> x;
fin >> n;
p=0;
for (i=1; i<=n; i++)
{
fin >> nr;
if (nr%x==0)
p++,a[p]=nr;
}
fin >> m;
q=0;
for (i=1; i<=m; i++)
{
fin >>nr;
if (nr%x==0)
q++,b[q]=nr;
}
i=1,j=1;
while (i<=p && j<=q)
if (a[i]<b[j])
c[++k]=a[i],i++;
else
if (a[i]>b[j])
c[++k]=b[j],j++;
else
i++,j++;
while (i<=p)
c[++k]=a[i],i++;
while (j<=q)
c[++k]=b[j],j++;

for (i=1; i<=k; i++)


fout << c[i] << " ";
return 0;
}

#2668 comun
Se consideră trei șiruri de numere naturale a = (a , a , ..., a ), b = (b , b , ...,
1 2 n 1 2

b ) și c = (c , c , ..., c ). Toate cele trei șiruri sunt ordonate crescător.


n 1 2 n

Cerința
Să se determine un număr care apare în cele trei șiruri. Dacă există mai multe astfel de
numere, să se determine cel mai mic. Dacă nu există un număr comun celor trei șiruri, afișați
valoarea -1.

Date de intrare
Programul citește de la tastatură numărul n reprezentând lungimea celor trei șiruri. Apoi se
citesc n numere naturale, separate prin spații, reprezentând elementele șirului a. Apoi se
citesc alte n numere naturale, separate prin spații, reprezentând elementele șirului b. La final
se citesc n numere naturale, separate prin spații, reprezentând elementele șirului c.

Date de ieșire
Programul va afișa pe ecran numărul x, reprezentând cel mai mic număr natural care apare în
toate cele trei șiruri, sau va afișa -1, dacă șirurile nu au niciun element comun.

Restricții și precizări
 1 ≤ n ≤ 100.000
 numere din cele trei șiruri vor fi mai mici decât 100.000.000
 cele trei șiruri sunt ordonate crescător

Exemplu:
Intrare
5
3 6 6 8 10
8 8 8 10 10
1 1 8 10 30

Ieșire

Explicație
Numărul comun cel mai mic este 8. Mai există un număr comun celor trei șiruri, anume 10,
dar este mai mare.
#include <iostream>

using namespace std;


int n,i,j,o,a[100001],b[100001],c[100001];
int main()
{
cin >> n;
for (i=1; i<=n; i++)
cin >> a[i];
for (i=1; i<=n; i++)
cin >> b[i];
for (i=1; i<=n; i++)
cin >> c[i];
i=1;
j=1;
o=1;
while (i<=n && j<=n && o<=n)
if (a[i]==b[j] and a[i]==c[o])
{
cout<<a[i];
return 0;
}
else
if(a[i]<=b[j] and a[i]<=c[o])
i++;
else
if (b[j]<=a[i] and b[j]<=c[o])
j++;
else
o++;
cout << -1;
}

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