Informatică, întrebare adresată de feherdarius, 9 ani în urmă

Ce este gresit la acest algoritm?..
Se dau doi vectori cu câte n elemente, numere naturale. Verificați dacă cei doi vectori conțin exact aceleași elemente.


#include

using namespace std;

int main()
{
int n,i,j,k,b,c=0;
cin >> n;
int v[n],a[n];
for(i=1;i<=n;i++)
cin >> v[i];
for(i=1;i<=n;i++)
cin >> a[i];
for(i=1;i<=n;i++)
{
b=v[i];
k=0;
for(j=1;j<=n;j++)
{
if(b==a[j]&& k==0)
k++;
}
c=c+k;
}
if(c==n)
cout<<"DA";
else
cout<<"NU";
return 0;
}


artur99: Poate am copiat eu greșit, dar așa cred să fie
feherdarius: Zice Da... intradevar
feherdarius: Dar ideea mea era in felul urmator:
feherdarius: iau toate el din primul vector , incepand cu primul , pe care il compar cu fiecare el din al doilea vector, daca am gasit un element egal cu cel din primul vector m-am oprit si nu-l mai caut si pe al doilea ca atunci daca de exemplu in primul vector am v[1]=7 , v[2]=7 ,iar in al 2lea vector am v[1]=7 si v[4]=7 atunci k s-ar incrementa de 2 ori pentru fiecare..
artur99: aaa, păi nu merge cum ai făcut tu. pentru că tu resetezi k-ul la fiecare repetiție... Ai putea ceva de genul cu un vector de verificare, unde numeri de cate ori a apărut fiecare număr, gen k[x]++; dar fiind vorba de numere atât de mari, nu se prea poate.
feherdarius: retineam k-ul in c
artur99: păi în c, dar tu ai 1000 de elemente în vector, nu doar 2...
artur99: și oricum, la tine k-ul nu creste mai mult de 1 pentru că ai și condiția aia k==0, și o să crească la 1 doar când e 0
feherdarius: in fine, sa lasam Solutia mea
feherdarius: explica ce ai facut tu in codul tau

Răspunsuri la întrebare

Răspuns de artur99
12
Uite, codul tău corectat:

#include <iostream>
using namespace std;
int main(){
  int n,i,j,k,b,c=0,ok=1;
  cin >> n;
  int v[n],a[n];
  for(i=1;i<=n;i++)
    cin >> v[i];
  for(i=1;i<=n;i++)
    cin >> a[i];
  for(i=1;i<=n;i++){
    b=v[i];
    k=0;
    c=0;
    for(j=1;j<=n;j++){
      if(b==a[j]) k++;
      if(b==v[j]) c++;
    }
    if(c!=k) ok=0;
  }
  if(ok)
    cout<<"DA";
  else
    cout<<"NU";
  return 0;
}

artur99: Setăm ok=1 presupunând că șirurile sunt ok și corespund. Luăm fiecare element din primul vector. Numărăm în k de câte ori apare el în primul vector, iar în c de câte ori apare în al doilea vector. Dacă c și k sunt egale atunci acel element corespunde (ca să corespundă trebuie să apară tot de atâtea ori) în amândoi vectorii, dacă nu, am dat de un element care nu corespunde, și setăm ok=0.
feherdarius: Am inteles,mersi !
artur99: npc :D
Alte întrebări interesante