👤

Fie un tablou unidimensional cu 2*n elemente valori naturale. Din vector sunt sterse pe rand elemente din k in k pozitii. Numararea pozitiilor se va face cu revenire la prima in cazul in care indicele curent este mai mare decat n. Operatia se repeta de n ori. Determinati pozitia de inceput a numaratorii, astfel incat elementele ramase in vector sa aba suma maxima. Se va afisa pozitia de inceput si suma elementelor ramase in vector. Exemplu : Pentru n=3 si k=3 si A=( 3,10,15,4,2,10) se va afisa 2 si 35. Incepand numaratoarea de la pozitia 2 , au fost sterse in ordine elementele de pe pozitiile 4,1,5. va roooog mult

Răspuns :

#include <iostream>
using namespace std;
void copiaza_elem(int a[],int b[],int n){
int i;
for(i=1;i<=2*n;i++){
b[i]=a[i];
}
}
void misca_elem(int b[],int n,int m){
int i;
for(i=m;i<n;i++){
b[i]=b[i+1];
}
}
int main(){
int n,n0,poz,poz0,k,i,poz_max=0,suma_elem=0,suma_maxima=0,suma_k;
cout<<"Introduceti nr taieri:";
cin>>n;
cout<<"Introduceti distanta intre taieri:";
cin>>k;
int a[2*n+1],b[2*n+1];
cout<<"Introduceti elementele:\n";
for(i=1;i<=2*n;i++){
cin>>a[i];
suma_elem=suma_elem+a[i];
}
for(poz=1;poz<=2*n;poz++){
n0=2*n;
poz0=poz;
copiaza_elem(a,b,n);
suma_k=0;
for(i=1;i<=n;i++){
poz=poz+k-1;
if(poz>n0){
poz=poz%n0;
}
suma_k=suma_k+b[poz];
misca_elem(b,n0,poz);
n0--;
}
if(suma_elem-suma_k>suma_maxima){
suma_maxima=suma_elem-suma_k;
poz_max=poz0;
}
poz=poz0;
}
cout<<poz_max<<" "<<suma_maxima<<endl;
return 0;
}