Vector поменять местами элементы
Конкурс предназначен для подготовки к зональной компьютерной олимпиаде, проводимой в Индии, поэтому это не конкурс, на котором я бы что-то заработал. Просто нужна небольшая помощь, чтобы понять, что не так с моим кодом, потому что у меня такое чувство, что я упустил что-то большое и глупое. :П
Таким образом, в основном вопрос подытожен как этот.
Допустим, есть два вектора или массива. Вам нужно поменять местами
элементы между ними таковы, что сумма их максимальных элементов
это минимум. Однако вы можете поменять местами не более K раз. Тогда вывод
Значение этой суммы.
Мой подход был прост. Возьмите самое большое число из вектора 1 (V1) и поменяйте его на самое низкое из числа V2. Добавьте самые высокие значения каждого. Сделайте то же самое, но на этот раз поменяйте местами наибольшее число от V2 с самым низким от V1. Добавьте самые высокие значения каждого. Лучшим обменом будет тот, у которого наименьшая сумма, и продолжайте оттуда K раз.
В этом случае, если К = 1
Я бы сначала поменял V1 на 9 с V2. Это дает:
Сумма наибольшего числа 17, по сравнению с предыдущим 19. Второй обмен, который я мог сделать, это 10 от V2 с 5 от V1, дающего:
Это дает сумму как 19, так что лучше был первый обмен, и результат должен быть 17.
Вот мое решение:
Обратите внимание, что это делает все перестановки, т. Е. К. Таким образом, даже если текущая договоренность была лучшей, она все равно поменяла бы некоторые значения. Раньше я ломал, когда текущая аранжировка была лучшей. Причина в том, что я правильно выполнил все тесты, кроме ДВУХ! И угадайте, что было еще более раздражающим, по одному от каждого задания! 🙁
Поэтому я понял, что необходимо выполнить все переключатели К. Однако даже сейчас я ошибаюсь в двух тестах, должно быть, я что-то упустил.
И между прочим, задача 1 имеет K = 1.
Другие решения
Имейте в виду, я также не большой поклонник передачи вектора (даже в качестве ссылки) для изменения, так как нет никакой гарантии, что функция уже не будет иметь в нем ничего. Я думаю, что имеет больше смысла создавать целевой вектор, новый внутри функции, и передавать его обратно, что-то вроде:
Вы также заметите, что я перешел на использование size_t как тип индекса и внесены коррективы, чтобы он не стал отрицательным.
Все это предполагает, конечно, что вы пытаетесь изучить относительно простые концепции программирования. Профессиональные программисты на C ++, вероятно, использовали бы итератор для заполнения нового вектора, например:
или с минималистским (не требуется вызов функции, кроме стандартных библиотечных):
Как только вы посвятите себя изучению C ++, вы должны делать это с удовольствием. Нет ничего настолько плохого, как полуобращение на язык 🙂
Использовать алгоритм reverse , Требуются двунаправленные итераторы, поэтому вы проходите begin() а также end() :
Если вам нужна копия, перейдите по ссылке: reverse_copy
Но используя reverse_iterator сделает работу проще
Примечание: это хорошее место для использования auto (в C ++ 11) вместо длинного типа здесь:
Другие решения
Если я вас правильно понимаю, вы хотите минимизировать сумму двух максимальных элементов, по одному от каждого массива. Вы можете сделать только K перестановок.
Давайте предположим, что массивы отсортированы (это не изменит алгоритм).
Выберите массив, в котором элемент k по порядку меньше. Давайте назовем этот массив S, а другой массив B.
В каждом свопе берут самый большой элемент из массива S и своп с самым маленьким в массиве B.
Если в какой-то момент все элементы в массиве S меньше, чем в B, остановить.
Объяснение: Мы знаем, что максимальный элемент из обоих массивов будет в решении. Так что мы хотим, чтобы другой массив имел наименьший возможный максимальный элемент.
Это то, что делает этот алгоритм.
Логика этого вопроса
Для K = 1 наименьшее отклонение будет наибольшим значением (предположим, найденным в V1) + второе по величине значение другого вектора (называемого V2)
Я дал способ ниже, как это сделать
Есть два вектора V1 и V2
Шаг 1 -> найти самый большой элемент из всех, предположим, его в V1
Шаг 2 -> найти второй по величине элемент другого вектора, т.е. в этом случае (второй по величине элемент V2) предположим, что его имя e2
Шаг 3 -> найти самый большой из V2, предположим, его имя e1
Шаг 4 -> поменять местами наибольшее из V2, т.е. e1 с элементом V1 (где элемент V1 меньше, чем e2)
Выше шаги для к = 1
если вы повторите эти шаги, у вас может быть самый низкий перекос
Например. данный вопрос ->
V1 -> 1 14 2 3 10 4
найти самый большой из всех -> его 14 в V1
самый большой элемент находится в V1, поэтому найдите второй по величине из V2 -> его 5
Вектор. Поменять местами первый и максимальный элементы вектора
Препод задал задачку, а я тупой в С++, и не могу решить. Помогите пожалуйста! Вот задача: Дан.
Поменять местами заданные в диалоге строки матрицы (многомерного вектора)
Здравствуйте! помогите пожалуйста написать программу (обращение к элементам массива произвести.
Поменять местами два элемента массива
Помогите решить пжл! в С++ ваще не шарю , а скора сессия I сем – Алгоритмические языки.
Вектор какой? vector или массив?
Добавлено через 5 минут
Так в векторе же, по-моему, так же как и в массиве - обращение к элементам массива [], в векторе еще добавляется .at.
Уже нашел решение. swap(vct[id1], vct[id2]);
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Поменять местами два элемента в массиве
Добрый вечер. Такой вопрос. Как в двумерном массиве поменять два элемента. Первый элемент задаётся.
Поменять местами два элемента массива
Значит вот такую задачу на С++ мне помогли написать здесь,но сложновато для понимания,есть ли.
Поменять местами 2 указанных элемента массива
Никак не могу разобраться, как решить эту задачу, простейшее я смог сделать, а дальше не.
Поменять местами два элемента массива
подскажите ,массив из 16 HWND элементов ,как обменять 2 элемента местами в массиве простите.
Поменять местами максимальный и первый элементы массива
поменять местами максимальный элемент массива и первый (задача на двумерный массив) помогите.
Поменять в списке местами первый минимальный и последний максимальный элементы
односвязный список stl (c++) На основе данных входного файла создать список. Поменять в списке.
Нужна поддержка 11 стандарта (С++11). у меня CodeBlocks, т.е. он не поддерживает этот стандарт?
Попробовал проверить ошибки в Вижуал С++, пишет ошибок нет, но он древний, на семерке стоит криво, компилировать не хочет у меня CodeBlocks, т.е. он не поддерживает этот стандарт? CodeBlocks - среда разработки. За компиляцию отвечает компилятор. В CB он по дефолту mingw.
Зайдите в Setting > Compiler and debugger и поставьте галочку на флаге -std=c++11 (либо -std=c++0x). Можно также самому дописать данный флаг в Other options.
По контейнерам лучше проходится через итераторы
Добавлено через 3 минуты
Заработало. Попробую показать преподу первый код, надеюсь зачет получу.
Добавлено через 4 часа 47 минут
И все таки я попытался разобраться:
Но понял не все что написано в коде, да и не могу же я без пояснения прийти к преподу и тупо показать код.
меньше всего я смог понять
float arr[] = ;
Очень прошу пояснить, почему составляющие массива с буквой f на конце?
и пояснить: const int size = sizeof(arr) / sizeof(*arr);
Но понял не все что написано в коде, да и не могу же я без пояснения прийти к преподу и тупо показать код.
Очень прошу пояснить, почему составляющие массива с буквой f на конце? и пояснить:
Объявляем массив arr неопределенной длины (компилятор сам подсчитает количество элементов) и инициализируем его с помощью списка инициализации. f на конец обозначает что число имеет тип float.
можно использовать
Очень прошу пояснить, почему составляющие массива с буквой f на конце? и пояснить:
мы объявляем константу size и записываем в неё количество элементов массива (т.к. изначально мы размер не указывали явно).
Происходит это следующим образом: мы узнаем размер всего массива и делим его на размер одного элемента. *arr по сути означает то же, что и arr[0].
В цикле for мы перебираем все элементы массива.
endl всего-лишь выводит на экран символ перевода строки "\n" и сбрасывает буфер вывода (если что-то еще не вывелось - оно выводится).
Заголовочный файлы algorithm неверно называть библиотекой. И функция swap также содержится в нем.
Это мой первый пост на этом сайте для начинающих на C ++.
Мой вопрос довольно прост.
Напишите функцию, которая меняет порядок элементов в векторе.
Например, 1, 3, 5, 7, 9 становится 9, 7, 5, 3, I. Обратная функция
должен создать новый вектор с обратной последовательностью, оставив его исходный
вектор без изменений.
А вот и мой код. Когда я запускаю его, после слова «Печать» ничего не появляется. Я почти уверен, что где-то допустил глупую и простую ошибку, но просто не мог этого понять. Буду признателен за любую помощь.
Решение
Решение
Проблема с вашим кодом заключается в том, что вы меняете массивы между перестановками, и, следовательно, существует возможность перестановки одного элемента назад и вперед между массивами. Я имею в виду в первом обмене вы размещаете элемент Икс из массива1 в массив2 и при следующем обмене возможно, что вы снова поменяете его.
- Сортировать оба массива
- за Икс от 0 до К
- гипотетический обмен Икс минимальные элементы первого массива с Икс максимум элементов второго массива.
- результат = min (результат, max (результат, max (первый массив) + max (второй массив))
- гипотетический обмен Икс максимальное количество элементов первого массива с Икс минимальные элементы второго массива.
- результат = min (результат, max (результат, max (первый массив) + max (второй массив))
Поскольку оба массива отсортированы, вы можете найти максимальные элементы массивов после гипотетического обмена с одним сравнением.
Это принятая реализация:
Читайте также: