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

Нахождение двух минимальных элементов массива

19.10.2024, 14:01. Показов 1327. Ответов 8
Метки cpp, max, min (Все метки)

Студворк — интернет-сервис помощи студентам
Поиск двух минимумов
В массиве хранится информация о количестве людей, живущих на каждом из 15 этажей дома (на первом этаже — в нулевом элементе массива, на втором — в первом и т. д.). Определить два этажа, на которых проживает меньше всего людей. (Если минимальное количество жителей одинаково на 2х и более этажах, то вывести наименьшие этажи).

Входные данные
Элементы массива вводятся в одну строку через пробел.

Выходные данные
Вывести два числа в одной строке через пробел, сначала этаж с самым маленьким числом людей. При одинаковом количестве жителей - сначала наименьший этаж.

Пример
№ Входные данные Выходные данные
1 20 8 13 25 29 0 10 4 31 24 11 24 27 23 11 6 8

Код на плюсах:
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
#include <iostream>
 
using namespace std;
 
int main()
{
    int mi1=100000, mi2=1000000,index1,index2,ret;
    int m[15];
    for(int i=0;i<15;i++) { // ввод массива
        cin>>m[i];
    }
    for(int i=0;i<15;i++) { //проверка на первое минимальное
        if(m[i]<=mi1) { //если тек. число массива меньше чем минимальное, то:
            mi1=m[i]; //минимально = тек. числу массива
            index1=i; //запоминаем индекс этого числа
            ret=m[i];
        }
    }
    m[index1]=10000; // чтобы при повторной проверке он уже отделялся, но мы его запомнили
    
    for(int i=0;i<15;i++) { //проверка на второе мин. число, но уже с отделенным первым
        if(m[i]<=mi2) { //если тек. число массива меньше чем минимальное, то:
            mi2=m[i]; //минимально = тек. числу массива
            index2=i; //запоминаем индекс этого числа
        } 
    }
    m[index1]=ret; //восстанавливаем значение минимального в массиве (перед проверкой второго мы ставили ему 100000)
    for(int i=0;i<15;i++) { //цикл на проверку первого минмального (причем первое найденное)
        if(m[i]==mi1) { //если мин1 равно тек. числу
            cout<<i+1<<" "; //сразу вывод индекса числа
            for(int c=0;c<15;c++) {//сразу тут идем по второму циклу на второе число
                if(m[c]==mi2) {//если тек. число = мин числу2
                    cout<<c+1;//выводим номер число
                    return 0;//моментом брейкаем чтобы он не пошел дальше по массиву. Числа уже найдены.
                }
            }
        } 
    }
}
Проходит только 40% тестов... Спасибо за ответы!

Добавлено через 1 минуту
Выходные данные 6,8 (увидел что было не понятно)
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.10.2024, 14:01
Ответы с готовыми решениями:

Найти индексы двух минимальных элементов массива
Нужно найти индексы двух минимальных массива. Собственно сами минимальные я нашел... А как прикрутить индексы? #include...

Нахождение минимальных элементов
Не мог бы кто нибудь объяснить почему min1, min2, min3 изначально 99? void FirstArray(int Arr1){ int min1=99; int min2=99; ...

Нахождение первых N минимальных элементов вектора
Нужно найти N минимальных элементов в векторе, который состоит из элементов типа elem. Поскольку вектор большой, то нужно делать...

8
Модератор
Эксперт С++
 Аватар для zss
13771 / 10964 / 6491
Регистрация: 18.12.2011
Сообщений: 29,241
19.10.2024, 14:51
Найти индексы двух минимальных элементов массива
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
20.10.2024, 03:36
Цитата Сообщение от babaludatopssur Посмотреть сообщение
C++
12
13
    for(int i=0;i<15;i++) { //проверка на первое минимальное
        if(m[i]<=mi1) { //если тек. число массива меньше чем минимальное, то:
Что это за феерия? У вас же в вашем же комментарии написано "если тек. число массива меньше ...", а в коде использован оператор <=, то есть "меньше либо равно". Это как это? Напишите подробное объяснение, почему в комментарии написано одно, а в коде - другое.

Причем идея в комментарии - правильная. А в коде написан бред. Такой цикл будет искать последний минимальный элемент, а вам нужно - первый.

Цитата Сообщение от babaludatopssur Посмотреть сообщение
C++
14
15
16
            mi1=m[i]; //минимально = тек. числу массива
            index1=i; //запоминаем индекс этого числа
            ret=m[i];
В чем смысл заведения переменных mi1 и ret, если они будут хранить одно и то же значение. Зачем их две?

Цитата Сообщение от babaludatopssur Посмотреть сообщение
C++
24
index2=i; //запоминаем индекс этого числа
А зачем? У вас в коде переменная index2 нигде никак не используется. Она никому не нужна вообще. Зачем тогда вы ее завели?

Цитата Сообщение от babaludatopssur Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
    for(int i=0;i<15;i++) { //цикл на проверку первого минмального (причем первое найденное)
        if(m[i]==mi1) { //если мин1 равно тек. числу
            cout<<i+1<<" "; //сразу вывод индекса числа
            for(int c=0;c<15;c++) {//сразу тут идем по второму циклу на второе число
                if(m[c]==mi2) {//если тек. число = мин числу2
                    cout<<c+1;//выводим номер число
                    return 0;//моментом брейкаем чтобы он не пошел дальше по массиву. Числа уже найдены.
                }
            }
        } 
    }
И как этот супермегакод будет работать в ситуации, когда минимальные количества людей совпадают? Оба цикла найдут один и тот же индекс и выведут один и тот же этаж. Но это неправильно.

Но на самом деле а дичайшая феерия ситуации заключается в том, зачем было вообще писать эти циклы. Индексы минимальных элементов уже лежат в переменных index1 и index2. Это уже [почти] готовый ответ задачи. Зачем понадобились эти дикие циклы в конце, которые заново ищут то, что уже давно найдено???

Ответ: из-за ошибки, описанной выше, у вас в index1 и index2 получились последние индексы минимальных элементов, а в условии задачи требуются первые. Вместо того, чтобы найти и исправить ошибку, вы принялись городить какие-то дикие дополнительные циклы, которые сделали все еще хуже.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 14
20.10.2024, 08:57
Лучший ответ Сообщение было отмечено zss как решение

Решение

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
#include <stdio.h>
 
void min_two(int *arr, int size, int *imi1, int *imi2)
{
    int mi1=arr[0],mi2=0;
    
    *imi1=0;
    *imi2=-1;
    
    for (int i=1; i<size; i++)
    {
        if (arr[i] < mi1)
        {
            mi2=mi1;
            *imi2=*imi1;
            
            mi1=arr[i];
            *imi1=i;
        }
        else
            if (((*imi2 == -1) && (arr[i] >= mi1)) ||
                ((*imi2 != -1) && (arr[i] <  mi2))) 
            {
                mi2=arr[i];
                *imi2=i;
            }
    }
    
}
 
int main()
{
    int x[]={1,20,8,13,25,29,10,10,4,31,24,11,24,27,23,11,6,8};
    int i1,i2;
 
    min_two(x,sizeof(x)/sizeof(int),&i1,&i2);
    
    printf("i1=%d x[%d]=%d\n",i1,i1,x[i1]);
    printf("i2=%d x[%d]=%d\n",i2,i2,x[i2]);
 
    return 0;
}
0
0 / 0 / 0
Регистрация: 19.10.2024
Сообщений: 1
20.10.2024, 11:12
Спасибо за ответ!
В первом и во втором цикле я искал впринципе минимально. (первый цикл первое минимальное, второй цикл второе минимальное.) Но если мы нашли первое минимальное, то при повторной проверке оно и будет. Поэтому я ему поставил значение перед проверкой на второе мин. m[index1]=10000 чтобы вычеркнуть его. Но перед этим запомнил его в переменную ret.

Нам необходимо найти индекс первого минимального (а если их двое, то первое по счету.) Для этого последний цикл и вложенный в него.
C++
1
for(int i=0;i<15;i++) { //цикл на проверку первого минмального (причем первое найденное)
- если мы нашли первое по счету минимальное то сразу выводим, а в этом же цикле:
C++
1
for(int c=0;c<15;c++) {//сразу тут идем по второму циклу на второе число
находим минимальное второе минимальное первое попавшееся. И СРАЗУ БРЕЙКАЕМ, чтобы он повторно не начал поиск.
Забыл упомянуть что запрещены sort; min; max; reverse; count
Код только на плюсах.

Извините, я новичок, понимаю что лоб...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12932 / 6800 / 1820
Регистрация: 18.10.2014
Сообщений: 17,211
20.10.2024, 19:38
Цитата Сообщение от babaludatop Посмотреть сообщение
В первом и во втором цикле я искал впринципе минимально. (первый цикл первое минимальное, второй цикл второе минимальное.)
Это хорошо. Но если немножко подумать (и в итоге просто заменить <= на <), то эти первые циклы уже нашли бы первые вхождения минимальных, то есть уже решили бы всю задачу.

Вот как бы выглядела ваша программа после такого исправления

Вариант
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
#include <iostream>
 
using namespace std;
 
int main()
{
    int mi1=100000, mi2=1000000,index1,index2;
    int m[15];
    for(int i=0;i<15;i++) { // ввод массива
        cin>>m[i];
    }
    for(int i=0;i<15;i++) { //проверка на первое минимальное
        if(m[i]<mi1) { //если тек. число массива меньше чем минимальное, то:
            mi1=m[i]; //минимально = тек. числу массива
            index1=i; //запоминаем индекс этого числа
        }
    }
    m[index1]=100000; // чтобы при повторной проверке он уже отделялся, но мы его запомнили
    
    for(int i=0;i<15;i++) { //проверка на второе мин. число, но уже с отделенным первым
        if(m[i]<mi2) { //если тек. число массива меньше чем минимальное, то:
            mi2=m[i]; //минимально = тек. числу массива
            index2=i; //запоминаем индекс этого числа
        } 
    }
    
   cout << index1 + 1 << " " << index1 + 2 << endl;
}


Цитата Сообщение от babaludatop Посмотреть сообщение
если мы нашли первое по счету минимальное то сразу выводим, а в этом же цикле:
C++
1
for(int c=0;c<15;c++) {//сразу тут идем по второму циклу на второе число
находим минимальное второе минимальное первое попавшееся.
Так где в этом втором цикле приняты какие-то меры для того, чтобы второй цикл нашел второе по счету в ситуации, когда mi1 и mi2 оказались одинаковы??? У вас первый цикл и второй цикл - совершенно одинаковые. Если mi1 == mi2, то одинаковые циклы дадут одинаковые результаты. А это неправильно.

Вот вам тест: 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5. На таком тесте ваша программа напечатает 1 1 потому то оба ваших цикла в конце программы дали один и тот же результат: нашли самое первое 5. Обратите внимание: ваши изначальные циклы поиска отработали правильно - они нашли две разные 5. Но вот циклы вывода результата нашли одну и ту же 5. В результате напечатался неправильный ответ.
0
848 / 651 / 323
Регистрация: 24.02.2017
Сообщений: 2,297
21.10.2024, 11:16
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
for(int i=0;i<15;i++) { // ввод массива
cin>>m[i];
ну и где
Цитата Сообщение от babaludatopssur Посмотреть сообщение
Элементы массива вводятся в одну строку через пробел.
Добавлено через 1 час 40 минут
в задании
Цитата Сообщение от babaludatopssur Посмотреть сообщение
Если минимальное количество жителей одинаково на 2х и более этажах, то вывести наименьшие этажи
и там же
Цитата Сообщение от babaludatopssur Посмотреть сообщение
Нахождение двух минимальных элементов массива
то есть при тесте
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
по заданию надо вывести 15 значений или только два?
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,267
21.10.2024, 21:13
C++ (Qt)
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
// кнопка 1
void Widget::press_pbtn_01()
{
    int x;
    QString str;
 
    // заполнение случайными числами
    for(int i = 0; i < 15; i++)
    {
        x = QRandomGenerator::global()->bounded(20);
        mass[i] = x;
 
        str = QString::number(x);
        ui->tableWidget->item(0, i)->setText(str);
    }
}
 
 
 
 
// кнопка 2
void Widget::press_pbtn_02()
{
    int xm1, xm2, im1, im2;
 
    xm1 = mass[0];
    im1 = 0;
    xm2 = mass[1];
    im2 = 1;
 
    if(xm2 < xm1)
    {
        std::swap(xm1, xm2);
        std::swap(im1, im2);
    }
 
    for(int i = 2; i < 15; i++)
    {
        if(mass[i] < xm2)
        {
            xm2 = mass[i];
            im2 = i;
        }
 
        if(xm2 < xm1)
        {
            std::swap(xm1, xm2);
            std::swap(im1, im2);
        }
    }
 
    ui->label_01->setNum(im1 + 1);
    ui->label_02->setNum(im2 + 1);
}
Миниатюры
Нахождение двух минимальных элементов массива  
0
 Аватар для ASCII
99 / 70 / 13
Регистрация: 15.12.2013
Сообщений: 463
21.10.2024, 22:26
Как идея - возьми
Code
1
std::priority_queue
и загони туда все свои элементы, затем вытащи из получившегося контейнера первые два элемента.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.10.2024, 22:26
Помогаю со студенческими работами здесь

Вычислить: количество минимальных элементов массива и сумму элементов массива, расположенных до первого минимума
В одномерном целочисленном массиве (размер массива не больше 20 и значения его элементов вводить с клавиатуры) вычислить:количество...

Нахождение максимальных элементов, находящийся на периметре матрицы, и минимальных элементов вне периметра матрицы
Разработать программу, которая в целочисленной квадратной матрице находит максимальный элемент(ы), находящийся на периметре матрицы, и...

Поиск двух минимальных элементов в массиве
Задача: Найти 2 четных минимальных элемента в массиве. Не могу разобраться как написать условие для поиска 2-ого минимального числа...

Вычислить величину Z, которая равняется сумме минимальных элементов массивов, разделенной на двойное произведение индексов минимальных элементов
Заданы два массива - Х(10) и Y(12). Вычислить величину Z, которая равняется сумме минимальных элементов массивов, разделенной на двойное...

С клавиатуры вводятся значения 10 элементов массива. Найти количество минимальных элементов в массиве
С клавиатуры вводятся значения 10 элементов массива. Найти количество минимальных элементов в массиве( допускается наличие 2-х и более...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru