Błąd "przekroczono limit czasu" na SPOJu - jak przyspieszyć program?

0

Próbuje zrobić zadanie http://pl.spoj.com/problems/FZI_STEF/, ale niestety cały czas dostaje błąd przekroczono limit czasu

#include <iostream>

using namespace std;

int main()
{
   long long n,suma=0,tmp=0,maks,tmp2,tmp3=0;
    cin >>n;
    long long int tab[n],tab1[n];
    for (int i=0;i<n;++i)
    {
        cin>>tab[i];
        if(tab[i]>tmp3) //szuka najwiekszej liczby 
            tmp3=tab[i];
        if(i>=2)
        {
            suma=suma+tab[i];
            if(suma>tmp)
                tmp=suma;
            tmp2=suma;
            for(int j=0;j<i-1;++j)
            {
                   tmp2=tmp2-tab[j];
                    if(tmp2>tmp)
                        tmp=tmp2;
            }
        }
        else
        {
            suma=suma+tab[i];
            if(suma>tmp)
                tmp=suma;
        }

    }
    if(tmp3>tmp)
        tmp=tmp3;
    cout<<tmp;
    return 0;
}
1
long long int tab[n],tab1[n];

Nie możesz tak zrobić w C++, to jedna kwestia.
A druga - skoro otrzymujesz przekroczenie czasu, to napisałeś kijowy algorytm rozwiązania tego zadania, tyle w temacie :P
Musisz wymyślić inny, a nie optymalizować program.

2

Mocno przekombinowałeś, da się to zrobić bez tablicy i dużo prościej. Tak więc wywal to wszystko i zacznij od nowa, pamiętając że jedyne czego potrzebujesz to maksymalny zysk, a gdyby nasz piosenkarz odbył wszystkie koncerny i w danym momencie trasy traciłby, to zysk od początku do niego wynosiłby zero (tak w ramach podpowiedzi).

0

zrobiłem dużo prościej, ale znowu to samo

#include <iostream>

using namespace std;

int main()
{
   long long n,tmp=0,a;
    cin >>n;
    long long int tab[100000]={0};
   for(int i=0;i<n;i++)
   {
       cin>>a;

       for(int j=0;j<i+1;j++)
       {
           tab[j]=tab[j]+a;
           if(tab[j]>tmp)
                tmp=tab[j];

       }
   }
   cout<<tmp;
    return 0;
}
 
1

Uprość jeszcze trochę i będzie picobello. To da się rozwiązać w jednym przejściu, bez zapisywania kolejnych liczb do tablicy:)

1

Widzę że się starasz, więc masz pseudokod poprawnego rozwiązania:

chwilzysk = 0, wynik = 0
dla każdej wczytanej liczby:
    chwilzysk += liczba
    jeśli chwilzysk > wynik to wynik = chwilzysk
    jeśli chwilzysk < 0 to chwilzysk = 0
wyswietl wynik
 

Prawda że dużo prostsze i szybsze?

0

Dzięki za pomoc wszystko działa jak należy

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