Условие
Задан массив из [latex]n[/latex] целых чисел. Переместить все минимальные элементы в начало массива, не меняя порядок других.
Входные данные
В первой строке записано натуральное число [latex]n[/latex]. В следующей строке записаны [latex]n[/latex] целых чисел. Все числа по модулю не превышают [latex]100[/latex].
Выходные данные
Выведите элементы обновленного массива.
Тесты
№ | Ввод | Вывод |
---|---|---|
1 | 7 6 -3 -7 4 -7 -4 5 |
-7 -7 6 -3 4 -4 5 |
2 |
2 100 -100 |
-100 100 |
3 |
6 -2 -2 7 3 99 -2 |
-2 -2 -2 7 3 99 |
4 |
5 1 1 1 1 1 |
1 1 1 1 1 |
Решение
Вместо обычных массивов будем использовать векторы, чтобы было удобнее добавлять элементы в конец. Минимальный элемент можно найти с помощью простого цикла: если какой-либо элемент вектора меньше min, то min присваивается значение этого элемента, и так пока не найдено наименьшее число. Подсчитаем, сколько раз оно встречается в векторе. Столько же раз его нужно добавить в новый вектор. Наконец, переносим в v2 все оставшиеся элементы, не равные min.
Код программы
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> #include <vector> using namespace std; int main() { int n; cin >> n; vector <int> v, v2; int x; while(cin>>x) v.push_back(x); int min = v[0]; for(int q=1; q<n; q++) { if(v[q]<min) min = v[q]; } int min_counter = 0; for(int w=0; w<n; w++) { if(v[w] == min) min_counter++; } for(int e=0; e<min_counter; e++) v2.push_back(min); for(int r=0; r<n; r++) { if(v[r]!=min) v2.push_back(v[r]); } for(int t=0; t<n; t++) cout << v2[t] << " "; return 0; } |
Ссылки
решение на E-olymp
код на ideone
Да. Такой вариант мне больше нравится. Если еще и размер (capacity) поставить сразу по числу элементов, то решение будет иметь линейную сложность. Хотя, все это «из пушки по воробьям» — два вектора вместо одного массива.
Задача легко решается без всяких трюков и сложных структур данных:
В строках 10-12 все минимальные элементы стираются, а в 13-й они добисываются на нужные места в начало.
Но зачтено и в Вашей версии. С учетом того, что прошлая Ваша попытка фактически реализовала сортировку пузырьком в самой не эффективной версии, даю Вам задачу 2663, которая поможет разобраться с этим алгоритмом. Желаю успехов.