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

Buna, am rezolvat problema #521 kSecventa de pe pbinfo. Imi poate explica cineva logica formulelor pt. variabilele start1 si start2 din acest cod???? Nu inteleg cum s a ajuns la ele..


#include

using namespace std;

int main()
{
int n,i,j,start1,start2,k,a[1001];
cin >>n;
cin >>k;
for (i=1; i<=n;i++)
cin >>a[i];
bool eBun;
for (i=0; i {
start1=(i-1)*(n/k)+1;
cout <<"start1"<<" "< for (j=i+1; j<=k;j++)
{
start2=(j-1)*(n/k)+1;
cout <<"start2"<<" "< eBun=true;
//ne trebuie o secventa care sa extraga acelasi numar de elemente din vector si sa le grupeze in secvente distincte
for (int p=0; p if (a[start1+p]!=a[start2+p])
{
eBun=false;
break;

}
if (eBun)
{cout < return 0;
}
}
}
cout <<"NU";


return 0;
}
Multumesc!!!!


boiustef: să ştii că dacă ăn cod ai semnul <, trebuie să-l separi de caracterele vecine prin spaţiu, altfel trunchiază codul şi vedem ce vedem acum şi nu e cod complet pentru a înţelege
sikesjack1: am inteles
sikesjack1: dar la ce se refera, start1=(i-1)*(n/k)+1; si start2=(j-1)*(n/k)+1;?
boiustef: Scrie te rog secventele for unde se crează start1 şi start2, nu uita de spatii
boiustef: ştii să te folosesti de pastebin.com , să plasezi acolo codul dar aici să plasezi linkul ?
boiustef: cred că start1 este indicele de început a secvenţei curente pentru i, iar start2 a secvenţei pe care o parcurge j
boiustef: de unde ai codul acesta? şi lucrează bine?
boiustef: iată aici şi codul meu:
https://pastebin.com/up6yaVkH

Răspunsuri la întrebare

Răspuns de boiustef
1

Răspuns:

#include <iostream>

using namespace std;

int n,k,secvi,secvj,starti,startj,p,a[1001], i, ok;

int main()

{

   cin >> n >> k;

   for (i=1; i<=n; ++i) cin >> a[i];

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

   {

       starti=(secvi-1)*(n/k)+1;

       for (secvj=secvi+1; secvj<=k; ++secvj)

       {

           startj=(secvj-1)*(n/k)+1;

           ok=1;

           for (p=0; p<n/k; ++p )

           {

               if (a[starti+p]!=a[startj+p])

                   { ok=0; break; }

           }

           if (ok)

           {

               cout << secvi << " " << secvj;

               return 0;

           }

       }

   }

   if (ok==0) cout << "NU";

}

Explicație:

cercetează codul meu că e mai simplu, cred eu :)))

secvi e secvenţa parcursă parcă de i (e o parabolă)

secvj e secvenţa de parcă parcursă de j

starti e indicele primului număr din secvi

startj este indicele primului număr din secvj

p va parcurge valori de la 0 la n/k-1 şi astfel

starti+p sunt indicii numerelor din secvi, iar

startj+p sunt indicii numerelor din secvj

Să facem puţină mate cu formula starti=(secvi-1)*(n/k)+1;

fiecare secvenţă are n/k numere,  15/5=3 numere în secvenţă.

Dacă secvi=1, at. starti=(1-1)*(3)+1=1, adică start1 e poziţionat pe primul număr din secvenţa1, care acum se numeşte secvi

Dacă secvi=2, at. starti=(2-1)*3+1=4, adică starti este poyiţionat pe al patru-lea număr, care este primul din secvenţa a doua ....

Şi analog se fac calculele şi pentru startj

Sper să fiu înţeles....


sikesjack1: Da, am inteles, suuper explicatii, multumesc tare mult! :)
boiustef: cu plăcere
Alte întrebări interesante