Упражнения на использование структур pair и сортировку

A: Простая задача

Создайте переменную типа pair <int, int>. Считайте два числа, запишите их в эту переменную. Затем выведите оба поля этой переменной через пробел.

Программа должна содержать только одну переменную типа pair <int, int> и никаких других переменных.

Ввод Вывод
1 2
1 2

B: Обмен

Создайте две переменные типа pair <int, string>. Cчитайте их значения, обменяйте значения двух переменных при помощи функции swap, выведите оба поля обеих переменных.

Программа должна содержать только две переменные типа pair <int, string> и никаких других переменных.

Ввод Вывод
1 one
2 two
2 two
1 one

C: Сортировка пар

Программа получает на вход \(N\) пар целых чисел (сначала записано число \(N\), затем в \(N\) строках по два числа). Создайте вектор пар, считайте в него данные числа, упорядочите при помощи функции sort и выведите результат.

Ввод Вывод
3
1 2
2 1
1 1
1 1
1 2
2 1

D: Личные дела

Однажды, неловкая секретарша перепутала личные дела учащихся. Теперь их снова необходимо упорядочить сначала по классам, а внутри класса по фамилиям.

В первой строке входных данных записано число \(N\) (\(1 \le N \le 10^5\)) – количество личных дел. Далее записано \(N\) строк, каждая из которых состоит из фамилии учащегося (строка без пробелов) и номера класса (целое число от 1 до 11).

Нужно вывести список всех учащихся, сначала выводя номер класса, затем — фамилию учащегося. Список должен быть отсортирован по классу, а затем по фамилии.

Ввод Вывод
3
Ivanov 10
Petrov 9
Sidorov 9
9 Petrov
9 Sidorov
10 Ivanov

E: Результаты олимпиады

В олимпиаде участвовало N человек. Каждый получил определенное количество баллов, при этом оказалось, что у всех участников — разное число баллов.

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

Программа получает на вход число участников олимпиады N. Далее идет N строк, в каждой строке записана фамилия участника, затем, через пробел, набранное им количество баллов.

Выведите список участников (только фамилии) в порядке убывания набранных баллов.

Ввод Вывод
3
Ivanov 15
Petrov 10
Sidorov 20
Sidorov
Ivanov
Petrov

F: Сортировка по последней цифре

Даны \(N\) натуральных чисел. Упорядочите их в порядке возрастания последней цифры числа, а при равенстве последней цифры — по возрастанию самих чисел. Упорядоченные числа выведите через пробел.

Ввод Вывод
3
123 321 333
321 123 333

G: Сортировка по длине слов

Даны \(N\) строк. Упорядочите их в порядке возрастания длины строки, а при равной длине — в лексикографическом порядке.

Ввод Вывод
3
abc
bc
cba
bc
abc
cba

H: Решение задач

Мальчик Антон решает вступительную работу в летний математический лагерь. В ней \(N\) заданий, которые можно выполнять в произвольном порядке. Разные задачи требуют разного времени для решения в зависимости от их сложности. Пусть сложность \(i\)-го задания равна \(T_i\). Если задание с номером \(i\) выполнять \(j\)-м по счету, Антону потребуется \(T_i\times j\) времени: чем больше думаешь, тем больше устаешь. Например, если начать с первой задачи, а затем выполнить вторую, то потребуется \(T_1\times 1 + T_2\times2\) времени, а если выполнить сначала вторую задачу, а затем первую — то \(T_2\times 1 + T_1\times2\) . Подскажите Антону, в каком порядке нужно решать задачи, чтобы на выполнение всей работы ушло как можно меньше времени.

Первая строка входных данных содержит число \(N\) — количество задач. Во второй строке записано \(N\) целых чисел \(T_1\), \(T_2\), ..., \(T_N\) через пробел.

Требуется вывести номера задач в том порядке, в котором их нужно решать, чтобы уложиться в минимальное время. Если решений несколько, нужно вывести любое из них.

Ввод Вывод
2
2 3
2 1

I: Свадьбы – 2

Одна очень предприимчивая и симпатичная девушка решила собрать себе денег на роскошную жизнь. У нее есть \(N\) поклонников, про каждого из них она узнала размер его состояния \(P_i\). Девушка намерена выйти замуж и сразу же развестись с некоторыми из своих поклонников так, чтобы в результате получить максимально возможное состояние. По законам страны в случае развода каждый из супругов получает ровно половину их общего состояния.

Первая строка входных данных содержит число \(N\le10^5\)—  количество поклонников. Вторая строка содержит \(N\) натуральных чисел \(X_1\), ..., \(X_N\) — размеры состояний поклонников. Третья строка содержит одно число \(Y\) — состояние девушки.

Программа должна вывести число \(K\) — количество раз, сколько девушка выйдет замуж. В следующей строке необходимо вывести \(K\) чисел от 1 до \(N\) каждое — номера поклонников в том порядке, в котором девушка будет выходить за них замуж. Разумеется, ни один из поклонников не согласится повторно жениться на подобной особе.

Ввод Вывод
2
5 10
5
2
1 2
3
1 3 2
0
3
1 3 2
1
1
2
0

J: World of tanks – 2

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

Первая строка входных данных содержит количество танков \(N\le 10^5\). Следующие \(N\) строк содержат по два числа \(x_i\) и \(y_i\) — координаты танков (\(0\lt x_i\le 10^3\), \(-10^3\le y_i\le 10^3\)).

Программа должна вывести одно число — необходимое количество выстрелов \(K\). В следующей строке необходимо вывести \(K\) чисел от 1 до \(N\) — номера танков противника, по котором необходимо произвести выстрелы.

Ввод Вывод
4
1 0
1 -1
2 2
3 3
3
1 2 4

K: Такси – 2

После затянувшегося совещания директор фирмы решил заказать такси, чтобы развезти сотрудников по домам. Он заказал \(N\) машин —ровно столько, сколь у него сотрудников. Однако когда они подъехали, оказалось, что у каждого водителя такси свой тариф за 1 километр.

Директор знает, какому сотруднику сколько километров от работы до дома (к сожалению, все сотрудники живут в разных направлениях, поэтому нельзя отправить двух сотрудников на одной машине). Теперь директор хочет определить, сколько придется заплатить за перевозку всех сотрудников. Естественно, директор хочет заплатить как можно меньшую сумму.

В первой строке записано число сотрудников \(N\le10^5\), во второй строке записаны \(N\) чисел через пробел, задающих расстояния в километрах от работы до домов сотрудников компании. В третьей строке записаны \(N\) чисел — тарифы за проезд одного километра в такси.

В первой строке программа должна вывести минимальную стоимость доставки всех сотрудников.

Во второй строке программа должна вывести \(N\) чисел. Первое число — номер такси, в которое должен сесть первый сотрудник, второе число — номер такси, в которое должен сесть второй и т.д. Если вариантов рассадки сотрудников, при которых затраты минимальны, несколько, выведите любой из них.

Ввод Вывод
3
10 20 30
50 20 30
1700
1 3 2
5
10 20 1 30 30
3 3 3 2 3
243
5 1 3 2 4

L: Создание архива – 2

Системный администратор вспомнил, что давно не делал архива пользовательских файлов. Однако, объем диска, куда он может поместить архив, может быть меньше чем суммарный объем архивируемых файлов.

Известно, какой объем занимают файлы каждого пользователя.

Напишите программу, которая по заданной информации о пользователях и свободному объему на архивном диске определит максимальное число пользователей, чьи данные можно поместить в архив.

Программа получает на вход в одной строке число \(S\)  размер свободного места на диске, и число \(N\) — количество пользователей. Следующие \(N\) строк содержат информацию о пользователях, в каждой строке записано имя пользователя (строка из латинских заглавных и строчных букв) и одно число — объем данных данного пользователя.

Программа должна вывести в первой строке число \(K\) — наибольшее количество пользователей, чьи данные могут быть помешены в архив. Затем программа должна вывести \(K\) строк, содержащих имена пользователей, чьи данные следует поместить в архив.

Ввод Вывод
100 3
Archie 50
Barnett 30
Calvin 50
2
Calvin
Archie

M: Коньки – 2

В 179 школе есть много коньков самых разных размеров. Школьник может надеть коньки любого размера, который не меньше размеров его ноги. Известны размеры всех коньков и размеры ног школьников. Определите, какое наибольшее число школьников сможет одновременно пойти покататься.

Первая строка входных данных содержит количество коньков \(N \le 10^5\). Во второй строке записаны \(N\) чисел — размеры коньков. В третьей строке записано количество школьнико \(M \le 10^5\). В следующих \(M\) строках записана информация о школьниках, в каждой строке записано имя школьника (строка из латинских заглавных и строчных букв) и одно число — размер ноги школьника. Все размеры — натуральные числа, не превосходящие \(10^9\).

Программа должна вывести число \(K\) — наибольшее количество школьников, которое сможет пойти на каток. В следующих \(K\) строках необходимо вывести имена школьников и размер коньков, которые наденет данный школьник.

Ввод Вывод
4
41 40 39 43
3
Archie 42
Barnett 41
Calvin 42
2
Calvin 43
Barnett 41

N: Тройки чисел

Даны тройки целых чисел. Упорядочите их в лексикографическом порядке.

Первая строка входных данных содержит количество \(N \le 10^5\). В следующих \(N\) строках записано по три целых числа.

Выведите \(N\) строк, упорядочив данные тройки чисел в лексикографическом порядке (сначала по первому числу, затем — по второму, при их равенстве — по третьему).

Ввод Вывод
4
3 2 1
3 2 2
1 2 3
3 1 2
1 2 3
3 1 2
3 2 1
3 2 2

Указание. Сделайте структуру pair, один из компонентов которой в свою очередь также будет pair.

O: Сортировка дробей

В этой задаче вам нужно научиться сортировать не числа, а рациональные дроби. Программа получает на вход \(N\) дробей: сначала задается число \(N\), потом идет \(N\) строк, в каждой из которых записана одна дробь. Дробь записана в виде \(a/b\), где \(a\) и \(b\) —натуральные числа.

Программа должна вывести список этих дробей в порядке неубывания. Если в списке есть две равные дроби \(a/b=c/d\), то раньше выводится дробь, у которой меньше числитель.

Ввод Вывод
3
4/2
2/6
1/2
2/6
1/2
4/2

Указание как считывать данные вида a/b:

int a, b;
char c;
cin >> a >> c >> b;

P: ICPC

На командных олимпиадах по программированию, проводимых по правилам ICPC, команды в турнирной таблице упорядочены следующим образом:

  1. по количеству решенных задач в порядке убывания.
  2. при равенстве числа решенных задач — по штрафному времени в порядке возрастания.
  3. при равенстве первых двух параметров — по номеру команды в порядке возрастания.

Упорядочите результаты олимпиады по этим правилам.

Первая строка входных данных содержит количество команд \(n\) (\(1\le n\le 100\,000\)), участвовавших в турнире. Следующие \(n\) строк содержат результаты команд. В \(i\)-й строке записано два целых числа \(s_i\) (\(0\le s_i\le 100\)) — количество задач, решенных \(i\)-й командой и \(t_i\) (\(0\le t_i\le 100\,000\)) — штрафное время \(i\)-й команды.

Программа должна вывести \(n\) чисел от 1 до \(n\) — номера команд в порядке их следования в турнирной таблице.

Ввод Вывод
5
3 50
5 720
1 7
0 0
8 50
5 2 1 3 4

Q: Рейтинг кавалеров

Другая симпатичная и предприимчивая девушка ищет себе идеального партнера для танцев.

Идеальный кавалер по ее представлениями должен иметь рост 180 сантиметров, поэтому прежде всего она хочет найти юношу, чей рост как можно ближе к 180 сантиметрам. Будет ли кавалер выше или ниже указанной величины, не имеет значения (то есть юноши с ростом 179 и 181 сантиметр одинаково привлекательны).

Среди всех кандидатов одного роста ей нужен кто-то, чей вес насколько это возможно, близок к 75 килограмм, но не превышает этой величины. Если же все кандидаты одного роста весят более 75 килограмм, то девушка выберет самого легкого из них.

Вам дан список кавалеров, содержащий имя партнера, его рост и вес.

Отсортируйте список по критерию привлекательности роста, при равной привлекательности роста —по привлекательности веса. При одинаковых параметрах роста и веса список должен быть отсортирован в лексикографическом порядке.

Выведите отсортированный список (только имена кавалеров).

Ввод Вывод
10
George 195 110
Thomas 180 75
John 180 75
James 180 65
Andrew 165 110
Martin 170 70
William 180 77
Franklin 195 70
Benjamin 165 70
Theodore 165 80
John
Thomas
James
William
Martin
Benjamin
Franklin
Theodore
Andrew
George

R: Сортировка масс

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

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

Поэтому они решили найти человека, который был бы в силах решить эту задачу за них, и обещают взять его на работу в эту перспективную и процветающую компанию. Решите задачу, и, кто знает, может, повезет именно Вам?

В первой строке входных данных находится целое число \(N\) (\(1\le N\le 1000\)) — количество нефтепроводов. В каждой из следующих \(N\) строк находится количество (точнее — масса) нефти, транспортированной по соответствующему нефтепроводу за сутки, по одному в строке. Масса нефти задана целым числом от 1 до 10000 с указанием соответствующей единицы измерения. Число и единица измерения разделены ровно одним пробелом. Единица измерения задается одной из трех букв: g (граммы), p (пуды), t (тонны), причем перед этой буквой может стоять одна из приставок: m (милли-), k (кило-), M (мега-), G (гига-). Напомним, что эти приставки обозначают умножение единицы измерения на 10-3, 103, 106 и 109 соответственно. 1 пуд = 16380 граммов, 1 тонна = 106 граммов.

Выведите N строк, в которых должны быть записаны массы нефти в порядке неубывания. Каждая строка должна описывать массу нефти в одном из нефтепроводов.

Масса должна быть описана согласно формату входного файла. Единицы измерения масс в выходном файле не обязаны соответствовать единицам измерения масс во входном файле, главное, чтобы массы были равны исходным. Все числа в выходном файле, также как и во входном, должны быть натуральными и не превышать 10000.

Ввод Вывод
5
234 g
4576 mp
2 t
32 mg
2 Mg
32 mg
234 g
4576 mp
2 t
2 t