Wyświetlenie trzeciej co do wielkości liczby dowolnego ciągu

0

Witam, mam problem z napisaniem programu dotyczącego wydrukowania / uzyskania trzeciej co do wielkości liczby dowolnego ciągu, takiego że a1, a2....
Nie potrafię napisać tej części programu z porównaniem tych liczb. Nie jest powiedziane ile ten ciąg ma wyrazów to zależy od nas.
Dziękuję za pomoc

0

Mógłbyś podać jakiś przykład?

0

Najłatwiej ten ciąg posortować malejąco po otrzymaniu i wypluć trzeci element.
Chyba, że jest jeszcze jakaś zależność, o której nie napisałeś.

Co do sortowania, poszukaj algorytmów, bo są ogólnodostępne, wraz z przykładowym kodem.

0

https://ideone.com/sBCds4

#include <iostream>
#include <set>
#include <iterator>
#include <vector>
#include <functional>
using namespace std;

template<typename C, 
         typename T = typename 
                      C::value_type>
T third_max_element(const C& coll)
{
    set<T, greater<T>> ret;
    for(const auto& el : coll)
    {
        ret.insert(el);
        if(ret.size() > 3u)
            ret.erase(prev(ret.end()));
    }
    return *ret.crbegin();
}

int main() {
	vector<int> nums{1,4,9,3,2,8,7};
    cout << third_max_element(nums) << endl;
	return 0;
}

Można jeszcze dodać drugi argument, do określenia ntego maksymalnego elementu

template<typename C, 
         typename T = typename 
                      C::value_type>
T nth_max_element(const C& coll, size_t nth_element)
{
    set<T, greater<T>> ret;
    for(const auto& el : coll)
    {
        ret.insert(el);
        if(ret.size() > nth_element)
            ret.erase(prev(ret.end()));
    }
    return *ret.crbegin();
}
0

Nie ma potrzeby wczytywania całego wejścia naraz. @YooSy podał algorytm on-line działający z małą stałą ilością pamięci roboczej. Trzeba tylko zmienić vector na jakiś strumień (czyli np wczytywanie liczb z std::cin).

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