Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 04.02.2018
Сообщений: 12

Среди элементов массива Z (m) найти k (k << m) крупнейших. Поиск осуществить за один проход (просмотр) массива Z

13.06.2018, 16:21. Показов 1904. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Среди элементов массива Z (m) найти k (k << m) крупнейших. Поиск осуществить за один проход (просмотр) массива Z
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.06.2018, 16:21
Ответы с готовыми решениями:

Среди элементов массива Z (m) найти k (k « m) крупнейших
Среди элементов массива Z (m) найти k (k « m) крупнейших. Поиск осуществить за один проход (просмотр) массива Z

Среди элементов массива Z (m) найти k (k << m) крупнейших
Среди элементов массива Z (m) найти k (k &lt;&lt; m) крупнейших. Поиск осуществить за один проход (просмотр) массива Z HELP ME !!!когда сама...

Найти k наибольших элементов массива (за один проход)
среди элементов массива Z(m) найти к наибольших(к&lt;&lt;m) . поиск осуществить за один проход по массиву

1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
23.09.2018, 02:19
Студент 25, здравствуйте. Вот несколько вариантов, которые я для вас подобрал. Надеюсь, вам это поможет:

Вариант 1:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
Дата и время написания программы:
 
21.09.2018
23:43
 
Условие задачи:
 
Среди элементов массива arr[n] найти k (k <= n) максимальных. Поиск осуществить за один проход (просмотр) массива.
 
Алгоритм:
 
1. Объявляем две целочисленные переменные (размерность массива и число искомых максимальных элементов).
2. Объявляем целочисленный контейнер типа set<int> (множество).
3. Вводим размерность массива (число n).
4. Объявляем одномерный целочисленный динамический массив размером n.
5. Вводим элементы массива и сразу же помещаем их в множество.
6. Вводим число k - количество искомых максимальных элементов.
7. Пробегаем итератором по переменной s типа set<int> и выводим найденные максимумы в порядке возрастания.
 
Решение:
*/
 
#include <iostream>
#include <set>
#include <algorithm>
#include <iterator>
 
    using namespace std;
    
int main() {
    int n, k; //Объявляем две переменные целого типа (число элементов исходного массива и количество максимальных) 
    set<int> s;
    cout << "Enter an array size:\n";
    cout << "n = ";
    cin >> n; //Вводим размерность массива
    int* arr = new int[n]; //Объявляем одномерный динамический массив a размером n
    cout << "Enter an array:\n";
    for (int i = 0; i < n; i++) {
        cin >> arr[i]; //Вводим элементы массива
        s.insert(arr[i]); //Добавляем элементы в множество (без повторов)
    }
    cout << "Enter a number (k <= n):\n";
    cout << "k = ";
    cin >> k; //Вводим число искомых максимумов
    cout << "Output of the program:\n";
    for (auto it = next(s.begin(), s.size() - k); it != s.end(); ++it) { //Пробегаем итератором по первым k элементам
        cout << *it << " "; //Выводим найденные максимумы в порядке возрастания (разыменовываем итератор)
    }
    delete [] arr; //Освобождаем память, выделенную под одномерный динамический массив
    system("pause"); //Функция задержки экрана консоли
    return 0; //Функция main() возвратила ноль при успешном выполнении программы (то есть, в коде выше ошибок не было)
}
Вариант 2:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/*
Дата и время написания программы:
 
22.09.2018
00:03
 
Условие задачи:
 
Среди элементов массива arr[n] найти k (k <= n) максимальных. Поиск осуществить за один проход (просмотр) массива.
 
Алгоритм:
 
1. Объявляем две переменные (размерность массива и количество искомых максимумов).
2. Объявляем два контейнера (множество и очередь с приоритетом).
3. Вводим размерность массива.
4. Вводим элементы массива, проверяя есть ли среди них повторяющиеся.
5. Добавляем уникальные элементы в очередь с приоритетом.
6. Вводим количество искомых максимумов.
7. Выводим искомые максимумы с помощью цикла (в порядке убывания).
 
Решение:
*/
 
#include <iostream>
#include <queue>
#include <set>
#include <algorithm>
 
    using namespace std;
  
int main() {
    int n, k; //Объявляем две переменные целого типа (число элементов исходного массива и количество максимальных) 
    priority_queue<int> queue; //Объявляем целочисленную очередь с приоритетом
    set<int> s; //Объявляем множество типа int
    cout << "Enter an array size:\n";
    cout << "n = ";
    cin >> n; //Вводим размерность массива
    int* arr = new int[n]; //Объявляем одномерный динамический массив a размером n
    cout << "Enter an array:\n";
    for (int i = 0; i < n; i++) {
        cin >> arr[i]; //Вводим элементы массива
        if (s.find(arr[i]) == s.end()) { //Условие, что множество не содержит заданный элемент  
            queue.push(arr[i]); //Добавляем элементы в очередь с приоритетом (без повторов)
            s.insert(arr[i]); //Добавляем элемент массива в множество, если он ранее еще не встречался  
        }
    }
    cout << "Enter a number (k <= n):\n";
    cout << "k = ";
    cin >> k; //Вводим число искомых максимумов
    cout << "Output of the program:\n";
    for (int i = 0; i < k; i++) { //Пробегаем циклом по первым k элементам
        cout << queue.top() << " "; //Выводим очередной максимум
        queue.pop(); //Удаляем максимум
    }
    delete [] arr; //Освобождаем память, выделенную под одномерный динамический массив
    system("pause"); //Функция задержки экрана консоли
    return 0; //Функция main() возвратила ноль при успешном выполнении программы (то есть, в коде выше ошибок не было)
}
Вариант 3:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*
Дата и время написания программы:
 
22.09.2018
00:28
 
Условие задачи:
 
Среди элементов массива arr[n] найти k (k <= n) максимальных. Поиск осуществить за один проход (просмотр) массива.
 
Алгоритм:
 
1. Объявляем две переменные (размерность массива и количество искомых максимумов).
2. Вводим размерность массива.
3. Вводим элементы массива.
4. Объявляем контейнер типа list<int> и передаем туда массив (через конструктор).
5. Удаляем из списка повторы.
6. Вводим количество искомых максимумов.
7. Выводим искомые максимумы с помощью цикла (в порядке убывания).
 
Решение:
*/
 
#include <iostream>
#include <list>
#include <algorithm>
 
    using namespace std;
  
int main() {
    int n, k; //Объявляем две переменные целого типа (число элементов исходного массива и количество максимальных) 
    cout << "Enter an array size:\n";
    cout << "n = ";
    cin >> n; //Вводим размерность массива
    int* arr = new int[n]; //Объявляем одномерный динамический массив a размером n
    cout << "Enter an array:\n";
    for (int i = 0; i < n; i++) {
        cin >> arr[i]; //Вводим элементы массива
    }
    list<int> s(arr, arr + n); //Объявляем список и передем туда исходный массив
    s.sort(); //Сортируем список
    s.unique(); //Удаляем из списка повторы
    cout << "Enter a number (k <= n):\n";
    cout << "k = ";
    cin >> k; //Вводим число искомых максимумов
    cout << "Output of the program:\n";
    for (auto it = s.rbegin(); it != prev(s.rend(), s.size() - k); ++it) { //Пробегаем итератором по первым k элементам
        cout << *it << " "; //Выводим найденные максимумы в порядке убывания
    }
    delete [] arr; //Освобождаем память, выделенную под одномерный динамический массив
    system("pause"); //Функция задержки экрана консоли
    return 0; //Функция main() возвратила ноль при успешном выполнении программы (то есть, в коде выше ошибок не было)
}
Вариант 4:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*
Дата и время написания программы:
 
22.09.2018
00:50
 
Условие задачи:
 
Среди элементов массива arr[n] найти k (k <= n) максимальных. Поиск осуществить за один проход (просмотр) массива.
 
Алгоритм:
 
1. Объявляем две переменные (число элементов последовательности и количество искомых максимумов).
2. Объявляем переменную типа vector<int>. 
3. Вводим число элементов последовательности.
4. Вводим элементы последовательности.
5. Вводим количество искомых максимумов.
6. Упорядочиваем вектор с помощью функции nth-element().
7. Выводим искомые максимумы с помощью цикла.
 
Решение:
*/
 
#include <iostream>
#include <vector>
#include <algorithm>
 
    using namespace std;
  
int main() {
    int n, m, k; //Объявляем две переменные целого типа (число элементов исходного массива и количество максимальных) 
    vector<int> arr; //Объявляем одномерный динамический массив (вектор)
    cout << "Enter an array size:\n";
    cout << "n = ";
    cin >> n; //Вводим число элементов последовательности
    cout << "Enter an array:\n";
    for (int i = 0; i < n; i++) { 
        cin >> m; //Вводим элемент последовательности
        if (find(arr.begin(), arr.end(), m) == arr.end()) { //Если в векторе ранее этот элемент не встречался
            arr.push_back(m); //Добавляем элемент в вектор
        }
    }
    cout << "Enter a number (k <= n):\n";
    cout << "k = ";
    cin >> k; //Вводим число искомых максимумов
    nth_element(arr.begin(), arr.begin() + 1, arr.end(), greater<int>()); //Упорядочивам вектор
    for (int i = 0; i < k; i++) {
        cout << arr[i] << " "; //Выводим искомые максимумы
    }
    system("pause"); //Функция задержки экрана консоли
    return 0; //Функция main() возвратила ноль при успешном выполнении программы (то есть, в коде выше ошибок не было)
}
P.S. Следует добавить, что большинство алгоритмов для данной задачи работают за линейное время, O(n), однако это не самый быстрый вариант. Эту задачу можно решить за O(log(n)), если использовать двоичную кучу (binary heap).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.09.2018, 02:19
Помогаю со студенческими работами здесь

Найти максимальную сумму элементов строк в один проход массива
2) Напишите программу, решающую поставленную задачу в один проход массива. задача:Ищет в двумерном массиве строку, сумма элементов...

Найти число минимальных элементов массива за один проход без использования дополнительной памяти
Найти число мин. элементов за один проход без использования массива. (Числа мы записываем в файл , потом считываем находим число мин. элем...

Массив: Найти количество элементов, равных заданному числу, за один просмотр массива.
Алгоритм сложности O(N). Дан массив, содержащий числа, более половины которых равны данному числу. Найдите это число за один просмотр...

Количество минимальных элементов массива за один проход
Здравствуйте! Очень нужна помощь! Есть достаточно простая задачка: &quot;В массиве хранится информация о среднедневной температуре за каждый...

Найти сумму четных элементов массива целых чисел. Размерность массива – 20. Заполнение массива осуществить случайными числами от 100 до 200
Найти сумму четных элементов массива целых чисел. Размерность массива – 20. Заполнение массива осуществить случайными числами от 100 до 200


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru