• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jak zmniejszyć pamięć zajmowaną przez program?

Object Storage Arubacloud
0 głosów
297 wizyt
pytanie zadane 1 maja 2020 w C i C++ przez gryzedywany Użytkownik (510 p.)
edycja 1 maja 2020 przez gryzedywany

W sprawdzarce pokazuj, że został przekroczony limit pamięci :/  zmieniłam typy na (wydaje mi się) najmniejsze z możliwych i tak nie pomogło :/ może czymś trzeba zastąpić wektor? tylko czym :/ poniżej wklejam mój kod oraz treść zadania.

#include <iostream>
#include <vector>
using namespace std;
float a;
vector <float> V;
short int i;
short int x, y;
int main()
{
    V.push_back(-1);
cin>>x;
while(x>0)
{
    cin>>y;
    //cin>>a;
   // V.push_back(a);
    // cout<<1<<" ";
    while(y>0)
    {

        cin>>a;
        i=0;
        while (V[i]>=a)
        {
         i++;
        }
        V.insert(V.begin()+i,a);
        cout<<i+1<<" ";
        y--;
    }
    V.clear();
x--;
}
//for(int i=0;i<V.size();i++)
//{
   // cout<<V[i]<<endl;
//}


return 0; }

Ranking

Masz napisać moduł do systemu obsługi konkursów programistycznych. Twój moduł będzie dostawał zapytania zawierające liczbę punktów uczestników konkursu. Dla każdego uczestnika musisz określić na której pozycji w rankingu znajdzie się w danym momencie, biorąc pod uwagę wyniki dotychczas wprowadzone do modułu - podobnie jak w trakcie zawodów w skokach narciarskich. Pozycję określa liczba zdobytych punktów (im więcej tym wyższa pozycja). Jeżeli kilku uczestników posiada taką samą liczbę punktów, o pozycji decyduje kolejność zgłoszeń (im późniejsze zgłoszenie tym niższa pozycja). Liczbę punktów podaje się w postaci liczby rzeczywistej dziesiętnej z dokładnością do pierwszego miejsca po przecinku.

Zadanie

 

Napisz program, który dla każdego kolejnego zgłoszenia uczestnika będzie podawał jego aktualną pozycję w rankingu.

 

Wejście

 

W pierwszym wierszu wejścia znajduje się jedna liczba naturalna, określająca liczbę zestawów danych, które za chwilę pojawią się na wejściu.
W pierwszym wierszu zestawu znajduje się jedna liczba naturalna niemniejsza niż 1 i niewiększa niż 10000. Określa ona liczbę zgłoszeń uczestników konkursu. W kolejnym wierszu znajduje się ciąg nieujemnych liczb rzeczywistych (z co najwyżej jedną cyfrą po przecinku) niewiększych niż 50, oddzielonych pojedynczymi spacjami. Liczby w tym wierszu określają liczbę punktów z jakimi zgłaszali się kolejni uczestnicy.

 

Wyjście

 

Dla każdego zestawu danych musisz wypisać w jednym wierszu ciąg liczb oddzielonych pojedynczymi spacjami. Liczby mają odpowiadać miejscom jakie w momencie zgłoszeń będą zajmować uczestnicy konkursu.

 

Przykład

 

Dla wejścia:

4
5  0.0  0.1  0.2  0.3  0.4
6  49.7  44.3  32.1  28.9  17.4  3.5
4  25.0  25.0  25.0  25.0
4  31.7  0.0  25.2  50.0

 

poprawnym rozwiązaniem jest:

1  1  1  1  1
1  2  3  4  5  6
1  2  3  4
1  2  2  1
komentarz 1 maja 2020 przez Whistleroosh Maniak (56,980 p.)
Czy ten kod jest do tego zadania? Bo nie wygląda jakby był do niego napisany
komentarz 1 maja 2020 przez gryzedywany Użytkownik (510 p.)
faktycznie, przepraszam. już poprawiłam
komentarz 1 maja 2020 przez Whistleroosh Maniak (56,980 p.)
Na początku dodałaś do vectora wartość -1 i to był całkiem dobry pomysł, ale zauważ, że pod koniec iteracji pierwszej pętli zerujesz ten vektor, czyli w kolejne iteracji tego -1 tam nie będzie, co może powodować różne błędy
komentarz 1 maja 2020 przez gryzedywany Użytkownik (510 p.)
Faktycznie to błąd ale problem jest jeszcze z czasem :(
komentarz 1 maja 2020 przez Whistleroosh Maniak (56,980 p.)
Można to zrobić na drzewach przedziałowych, wtedy działałoby w O(nlogn)
komentarz 1 maja 2020 przez gryzedywany Użytkownik (510 p.)
taki jest aktualny pomysł, zobaczę czy to pomoże
komentarz 2 maja 2020 przez j23 Mędrzec (194,920 p.)

Skoro V zawiera zbiór posortowany, można użyć std::lower_bound:

int main()
{
    float a;
    std::vector<float> V;
    int i, x, y;

    std::cin >> x;

    while (x-- > 0) {
        std::cin >> y;

        V.clear();
        V.reserve(y);
        
        while (y-- > 0) {
            std::cin >> a;

            auto it = std::lower_bound(V.rbegin(), V.rend(), a);
            i = std::distance(it, V.rend()) ;
            V.insert(V.begin() + i, a);
            
            std::cout << i + 1 << " ";
        }

        std::cout << '\n';
    }

    return 0;
}

Powinno być ciut szybciej od wyszukiwania liniowego.

komentarz 2 maja 2020 przez gryzedywany Użytkownik (510 p.)
mam błąd w kompilatorze w wierszu " auto it = std::lower_bound(V.rbegin(), V.rend(), a);"

"error: 'it' does not name a type|"
komentarz 2 maja 2020 przez Whistleroosh Maniak (56,980 p.)
Pewnie nie kompilujesz w c++11. Ale nawet jeżeli uda Ci się skompilować, to ten program i tak będzie pewnie wychodził poza limit czasowy. On korzysta z niewielkiej optymalizacji względem Twojego pomysłu. Dopiero to drzewo przedziałowe bardzo przyspieszy program
komentarz 3 maja 2020 przez j23 Mędrzec (194,920 p.)

@gryzedywany,

std::vector<float>::reverse_iterator it = std::lower_bound(V.rbegin(), V.rend(), a);

 

komentarz 3 maja 2020 przez gryzedywany Użytkownik (510 p.)
@j23 wychodzi poza limit czasowy

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
2 odpowiedzi 328 wizyt
0 głosów
1 odpowiedź 87 wizyt
pytanie zadane 16 października 2023 w Sprzęt komputerowy przez Piotrek2713 Mądrala (5,380 p.)

92,579 zapytań

141,432 odpowiedzi

319,661 komentarzy

61,963 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...