"Siano dati in ingresso due vettori V1 e V2 di numeri interi. Si supponga che entrambi i vettori siano disordinati. Scrivere un programma (in C++) che identifichi la più lunga sequenza di elementi ordinati del vettore V1 (denominata S1) e la più lunga sequenza di elementi ordinati del vettore V2 (denominata S2). Si provveda poi a scambiare tali sequenze: la sequenza S1 trovata nel vettore V1 deve essere inserita nel vettore V2 al posto della sequenza S2 e viceversa. Stampare infine i vettori V1 e V2."
Io l'ho risolto così:
- Codice:
#include <iostream>
using namespace std;
int main() {
cout<<"Scegliere la dimensione del primo vettore:\n";
int dim1;
int dim2;
cin>>dim1;
cout<<"Scegliere la dimensione del secondo vettore:\n";
cin>>dim2;
int vett1[dim1];
int vett2[dim2];
int i;
for (i=0;i<dim1;i++)
{cout<<"Inserisci l'elemento numero "<<i+1<<" del primo vettore:\n";
cin>>vett1[i];
}
for (i=0;i<dim2;i++)
{cout<<"Inserisci l'elemento numero "<<i+1<<" del secondo vettore:\n";
cin>>vett2[i];
}
cout<<"Il primo vettore è:\n";
for(i=0;i<dim1;i++)
{cout<<" "<<vett1[i];}
cout<<"\nIl secondo vettore è:\n";
for(i=0;i<dim2;i++)
{cout<<" "<<vett2[i];}
//introduco il vettore lunghezza1 e indpar1 in cui memorizzare le lunghezze e gli indici di partenza delle serie trovate
int j1=-1; int lunghezza1[dim1]; int uno1=1; int k1=0; int indpar1[dim1];
//azzero i vettori lunghezza1 e indpar1
for(i=0;i<dim1;i++)
{lunghezza1[i]=0;}
for(i=0;i<dim1;i++)
{indpar1[i]=0;}
//memorizzazione di lunghezze e indici nelle componenti dei vettori
for(i=1;i<dim1;i++)
{
if(vett1[i-1]<vett1[i])
{j1++; lunghezza1[j1]=++uno1; indpar1[j1]=k1;}
else
{uno1=1; k1=i;}
}
//calcolo dell'elemento massimo e sua posizione
int massimo1; int posmax1=0;
massimo1=lunghezza1[0];
for(i=1;i<dim1;i++)
{
if(massimo1<lunghezza1[i])
{massimo1=lunghezza1[i]; posmax1=i;}
}
cout<<"\nLa sequenza crescente più lunga del primo vettore ha lunghezza "<<massimo1<<" e parte dalla posizione "<<indpar1[posmax1]+1;
cout<<"\nEssa è:\n";
for(i=indpar1[posmax1];i<indpar1[posmax1]+massimo1;i++)
{cout<<" "<<vett1[i];}
//Faccio la stessa cosa per il secondo vettore
int j2=-1; int lunghezza2[dim2]; int uno2=1; int k2=0; int indpar2[dim2];
for(i=0;i<dim2;i++)
{lunghezza2[i]=0;}
for(i=0;i<dim2;i++)
{indpar2[i]=0;}
for(i=1;i<dim2;i++)
{
if(vett2[i-1]<vett2[i])
{j2++; lunghezza2[j2]=++uno2; indpar2[j2]=k2;}
else
{uno2=1; k2=i;}
}
int massimo2; int posmax2=0;
massimo2=lunghezza2[0];
for(i=1;i<dim2;i++)
{
if(massimo2<lunghezza2[i])
{massimo2=lunghezza2[i]; posmax2=i;}
}
cout<<"\nLa sequenza crescente più lunga del secondo vettore ha lunghezza "<<massimo2<<" e parte dalla posizione "<<indpar2[posmax2]+1;
cout<<"\nEssa è:\n";
for(i=indpar2[posmax2];i<indpar2[posmax2]+massimo2;i++)
{cout<<" "<<vett2[i];}
//scambio le sequenze ordinate e mostro i risultati
cout<<"\nSostituendo la sequenza ordinata del primo vettore con quella del secondo, il primo vettore diventa:\n";
for(i=0;i<indpar1[posmax1];i++)
{cout<<" "<<vett1[i];}
for(i=indpar2[posmax2];i<indpar2[posmax2]+massimo2;i++)
{cout<<" "<<vett2[i];}
for(i=indpar1[posmax1]+massimo1;i<dim1;i++)
{cout<<" "<<vett1[i];}
cout<<"\nSostituendo la sequenza ordinata del secondo vettore con quella del primo, il secondo vettore diventa:\n";
for(i=0;i<indpar2[posmax2];i++)
{cout<<" "<<vett2[i];}
for(i=indpar1[posmax1];i<indpar1[posmax1]+massimo1;i++)
{cout<<" "<<vett1[i];}
for(i=indpar2[posmax2]+massimo2;i<dim2;i++)
{cout<<" "<<vett2[i];}
}
Pare che funzioni, voi che dite? Grazie