Informatică, întrebare adresată de laurstefan2002, 8 ani în urmă

Problema #242 interclasM de pe pbinfo pls:
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


boiustef: eu cândva (12.09.2018) am făcut problema asta dar nu am folosit interclasare ci vectori caracteristici. Pbinfo nu s-a supărat şi a punctat-o cu 100... :)))
boiustef: cred te interesează anume folosirea interclasării
laurstefan2002: Imi e indiferent daca e cu interclasare sau vectori caracteristici, imi da 0p si e tema pe maine problema
boiustef: PENTRU COMPARARE POSTEZ SI VARIANTA CU VECTORI CARACTERISTICI... :)))
boiustef: AI SĂ AI DOUĂ METODE...

Răspunsuri la întrebare

Răspuns de pmarian98
9

Răspuns:

#include <iomanip>

#include <fstream>

#include <iostream>

#include <cassert>

using namespace std;

ifstream fin("interclasm.in");

ofstream fout("interclasm.out");

int a[100005],n, b[100005], m, c[200005], k;

int main(){

int x;

fin >> x;

fin >> n;

for(int i=1;i<=n;++i){

 fin >> a[i];

}

fin >> m;

for(int i=1;i<=m;++i){

 fin >> b[i];

}

int i=1,j=1;

k = 0;

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

 if(a[i]<b[j])

  if(a[i]%x == 0)

   c[++k] = a[i] , i++;

  else

   i++;

 else

  if(a[i]>b[j])

   if(b[j]%x == 0)

    c[++k] = b[j] , j++;

   else

    j++;

  else

   i++, j++;

if(i<=n)

 while(i<=n)

  if(a[i]%x == 0)

   c[++k] = a[i] , i++;

  else

   i++;

else

 while(j<=m)

  if(b[j]%x == 0)

    c[++k] = b[j] , j++;

   else

    j++;

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

{

 fout << c[i] << " ";

}

return 0;

}

Explicație:

Răspuns de boiustef
1

Răspuns:

Explicație:

#include <iostream>

#include <fstream>

#include <bitset>

using namespace std;

bitset<1000000>a;

int main()

{

   ifstream f("interclasm.in");

   ofstream g("interclasm.out");

   int x, n, m, i, num;

   f>>x>>n;

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

   {

       f >> num; a[num]=1;

   }

   f >> m;

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

   {

       f >> num;

       if (a[num]) a[num]=0;

       else a[num]=1;

   }

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

       if (a[i] && i%x==0)

           g << i << " ";

}


boiustef: ELEGANTĂ REZOLVARE, DA? COD SCURT ...
laurstefan2002: Mersi :)
Alte întrebări interesante