Problem z czasem algorytmu

Problem z czasem algorytmu
H1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:18
0

Dzień dobry !
Mam taki problem że mój program wykonuje się w 10 sekund a powinien w 5s. Gdzie jest leży problem , bardzo proszę o odpowiedź . Zaznaczam że jestem początkującym programistą c++ ,przesiadłem się z javy :) . Dołączam algorytm i przykładowe dane wejściowe.
Wejście :
6
3 2 1 1 5 1
3
3
13
9
Wyjście:
1
6
3

Kopiuj
#include <iostream>
#include <string>
#include <cstdlib>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(0);
    int g = -1;
    int n1,n2,d;
    int summ;
    cin >> n1;
    int zad[n1];
    for(int i = 0; i<n1; i++)
    {
        cin >> zad[i];
    }
    cin >> n2;
    int sny[n2];
    for(int j = 0; j<n2; j++)
    {
        cin >> sny[j];
    }
    sort(zad,zad+n1, greater < int >());
    for(int h = 0; h<n2; h++)
    {
        g++;
        summ = 0;
        d=0;
        while(summ < sny[g])
        {
            summ += zad[d];
            d++;

        }
    cout << d <<"\n";
    }
    return 0;
}



lion137
Jakie jest pytanie, same przykładowe dane niewiele mówią 😃
several
@lion137: Mam taki problem że mój program wykonuje się w 10 sekund a powinien w 5s @helikson123 wrzuć w formie załącznika te dane, których przetwarzanie zabiera Ci za dużo czasu
lion137
Ale jaki to program, co on ma robic?
several
  • Rejestracja:prawie 16 lat
  • Ostatnio:dzień
2

@helikson123 Wrzuć te dane w postaci załącznika, które zbyt długo się przetwarzają. A poza tym, to taki zapis w C++ jest niedozwolony

Kopiuj
cin >> n1;
int zad[n1];

Używasz tego dla dwóch tablic.


H1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:18
0
several napisał(a):

@helikson123 Wrzuć te dane w postaci załącznika, które zbyt długo się przetwarzają. A poza tym, to taki zapis w C++ jest niedozwolony

Kopiuj
cin >> n1;
int zad[n1];

Używasz tego dla dwóch tablic.

To jak można to inaczej zrobić ?

H1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:18
0

Treść zadania:
Krzysztof na teście ma pewną liczbę zadań. Za każde z nich można uzyskać ustaloną liczbę punktów która jest przyznawana tylko , jeśli zadanie zostanie w pełni rozwiązane.
Zawsze po teście nauczyciel Krzysztofa podaje ile punktów trzeba by zaliczyć test na 5. Każdej nocy Krzysztof ma sen w którym dowiaduje się ile wynosi wartość punktów na 5-tke.

Trzeba napisać program dla Krzysztofa który policzy ile musi rozwiązać zadań żeby dostał 5.
**Wejście : **
N (1 <= N <= 200000) określa liczbę zadań na teście
V1- Vi ( 1 <= Vi <= 10^9) określa liczbę punktów za poprawne rozwiązanie i-tego zadania.
Q (1<= Q <= 200000) określa liczbę snów Krzysztofa
P1 - Pi (1<= Pi <= Vi) określa "wyśniony" minimalny próg punktów na 5.

Wyjście:
Program powinien wypisać Q wierszy
W i-tym wierszu powinna się znaleźć jedna liczba naturalna - minimalna liczba zadań do rozwiązania na ocenę bardzo dobrą

Z góry dziękuje za odpowiedź

edytowany 1x, ostatnio: helikson123
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:17 minut
0

To jest jedno z tych zadań, gdzie trzeba sobie przygotować taką strukturę danych, by udzielać odpowiedzi w czasie stałym/logarytmicznym.
Przygotowanie takich danych to O(n long n) udzielenie wszystkich odpowiedzi to O(q log n).
Czyli w sumie O((n + q) log n)

Brakuje jeszcze: cin.tie(nullptr);


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
H1
  • Rejestracja:ponad 5 lat
  • Ostatnio:około 5 lat
  • Postów:18
0

Po zastosowaniu sum prefiksowych czas się zmniejszył ale teraz przy dużych liczbach do pliku nic się nie zapisuje :/
Ma ktoś jakiś pomysł jak to poprawić. Kod na dole:

Kopiuj
#include <iostream>
#include <string>
#include <cstdlib>
#include <algorithm>
using namespace std;

int main()
{

    ios_base::sync_with_stdio(0);
    int g = -1;
    int n1,n2,d;
    //loading data to memory
    cin >> n1;
    int zad[n1];
    long long pzad[n1];
    for(int i = 0; i<n1; i++)
    {
        cin >> zad[i];
    }
    cin >> n2;
    int sny[n2];
    for(int j = 0; j<n2; j++)
    {
        cin >> sny[j];
    }
    //sorting
    sort(zad,zad+n1, greater < int >());
    //prefix
    pzad[0] = 0;
    for(int k=1; k<=n1; k++)
    {
        pzad[k] = pzad[k-1] + zad[k-1];
    }
    for(int h = 0; h<n2; h++)
    {
        d=0;
        while(pzad[d] < sny[h])
        {
            d++;
        }
        cout << d << "\n";
    }
    
    return 0;
}



edytowany 1x, ostatnio: helikson123
MarekR22
sort(zad,zad+n1, greater < int >()); w tym miejscu tracisz relację między: zad a sny. Nie pisz wszystkiego w main bo się nie da tego czytać, dziel problem na mniejsze funkcje.
H1
Nie potrzebuje relacji między zad a sny
H1
A program postaram się podzielić na funkcje
MarekR22
eee.. pomyliłem wątek bo oba maja równie złe tytuły (konkrecyjny wątek to: Przekroczony limit czasu w zadaniu)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.