Zadania z podciągów C++ (maly problem)

0

Zadanie
Napisz program, który z ciągu n liczb naturalnych wypisze podciąg spójny o długości m liczb naturalnych o maksymalnej sumie.

moj program:

#include <iostream>

using namespace std;


int main()
 {
     int n,m;
    cout<<"Podaj ilosc wyrazow podciagu"<<endl;
    cin>>n;
    cout<<"Podaj dlugosc podciagu"<<endl;
    cin>>m;
    int tab[n],suma=0,sumaspr=0;
    cout<<"Podaj liczby podciagu: "<<endl;
    for (int i = 0; i < n; i++)
    {
      cin>>tab[i];
    }

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


   for(int j=i;j<m;j++)
        {
            if(j<n)
            {
               suma=suma+tab[j];
       }

   }

   if(sumaspr<suma)
        {
            sumaspr=suma;
        }
        suma=0;


   }
   cout<<sumaspr;


   return 0;
}
0

Z czym masz problem?

0

nie wiem jak moment od ktorego trzeba wypisywac

0
mlodyB1987 napisał(a):

nie wiem jak moment od ktorego trzeba wypisywac

Doprawdy? A ile może być maksymalnych wartości? (nie mylić z ilością elementów o maksymalnej wartości)

0

no chyba tylko jedna jest maksymalna wartosc

i dalczego mi wyskakuje okienko "zbyt wiele prob prosze sprobowac pozniej (chodzi o forum)"

0

Jak jedna wartość to czemu nie wiesz gdzie można wypisywać?
Jakie forum daje taki komunikat?
W jakich okolicznościach?
Co to ma wspólnego z kodem?
Czy przypadkiem nie pomyliłeś forum z uczelnianą sprawdzarką?

Poza tym "zbyt wiele" oznacza "za dużo" nie zaś "za mało"

0

w petle, dalej nie wiem co mam zrobic
jezeli chodzi o forum to wlasnie o to na ktorym piszemy
kiedy probuje odpisac pod tym postem
nie ma totalnie nic wspolnego z kodem ale powoduje problemy z komunikacja
nie jestem na uczelni tylko w licemu

4

Zastanów się jak szukałbyś rozwiązania gdybyś miał to zrobić na kartce papieru.

  1. Zsumuj pierwsze m liczb, czyli "początek" ciągu jest na pozycji 0 (suma obejmuje indeksy 0..m-1)
  2. Przesuń początek na kolejną pozycję i wylicz nową sumę, można to zrobić odejmując pierwszy element i dodając jeden element na końcu suma = suma-tablica[0]+tablica[m] (suma obejmuje indeksy 1..m)
  3. Jeśli nowa suma jest większa niż poprzednia to zapamiętujemy sobie są nową największą sumę i pamiętamy że podciąg zaczyna się na pozycji 1
  4. Przesuwamy się znów z początkiem o kolejną pozycję w prawo w analogiczny sposób
  5. Postępujemy tak dopóki nie dojdziemy do miejsca gdzie pomiędzy początkiem podciągu a końcem tablicy będzie mniej niż m liczb
0

kiedy probuje odpisac pod tym postem
nie ma totalnie nic wspolnego z kodem ale powoduje problemy z komunikacja

potwierdzam. wyskakuje okienko "zbyt wiele prób proszę spróbować później (chodzi o forum 4programmers.net)" co skutkuje problemy z komunikacją

w petle, dalej nie wiem co mam zrobic

najlepiej sobie wizualizować

for(int i=0; i<n; ++i)
    {
        if(i>n-m)break;
        for(int j=0, k = i; j<m; ++j)
        {
            cout<<"tab["<<k<<"] "<< tab[k] << "\n";
            if(j<n)
            {
                suma=suma+tab[k];
                ++k;
            }
        }
        cout<<"suma " << suma << "\n";
        cout<<".....................\n\n";
        if(sumaspr<suma)
        {
            sumaspr=suma;
        }
        suma=0;
    }
    cout<<sumaspr;
1
#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;

template<typename T> T input(const char *msg,T def) { return ((cout<<msg<<": ")&&(cin>>def))?def:def; }

int maxSumSubSequence(const vector<int> &tab,int m)
{
	int best=0;
    for(int sum=0,k=0,i=0;i<tab.size();)
    {
    	sum+=tab[i++];
    	if(i<m) continue;
		best=max(best,sum);
		sum-=tab[k++];
	}
	return best;
}

int maxSumSubSequenceCpp(vector<int> &tab,int m)
{
	transform(begin(tab),end(tab)-1,begin(tab)+1,begin(tab)+1,[](int p,int c)->int{ return p+c; });
	transform(begin(tab),end(tab)-m,begin(tab)+m,begin(tab)+m,[](int p,int c)->int{ return c-p; });
	return *max_element(begin(tab)+m,end(tab));
}

int main()
{
    int n=input("Podaj ilosc wyrazow ciagu",-1),m=input("Podaj dlugosc podciagu",-1);
    if((n<=0)||(m<=0)||(m>n)) exit(1);
    vector<int> tab(n);
    cout<<"Podaj liczby podciagu:"<<endl;
    for(int &v:tab) v=input("",0);
    cout<<maxSumSubSequence(tab,m)<<endl;
    cout<<maxSumSubSequenceCpp(tab,m)<<endl;
	return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1