Problem z czasem algorytmu

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

#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;
}



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

cin >> n1;
int zad[n1];

Używasz tego dla dwóch tablic.

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

cin >> n1;
int zad[n1];

Używasz tego dla dwóch tablic.

To jak można to inaczej zrobić ?

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ź

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);

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:

#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;
}



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