Тренировка: два указателя

A: Субботник - максимальный размер бригады

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

Определите максимальный размер бригады (чем больше людей в бригаде, тем легче носить брёвна!), неудобство которой не превышает \(M\).

Программа получает на вход числа \(N\) и \(M\) в первой строке (\(1\le N\le 10^5\), \(M\ge 0\)), во второй строке записано \(N\) натуральных чисел через пробел — значения роста.

Программа должна вывести одно целое число: максимальное число людей в бригаде, неудобство которой не превосходит \(M\).

Указание. Это типичная задача на метод двух указателей. Отсортируем массив и будем перебирать индекс члена бригады с наименьшим ростом. В другой переменной будем хранить индекс члена бригады с наибольшим ростом, которого можно поставить к выбранном члену бригады с наименьшим ростом. Когда индекс члена бригады с наименьшим ростом увеличивается, индекс члена бригады с наибольшим ростом также увеличивается. Решение имеет сложность сортировки + \(O(N)\).

Ввод Вывод
6 3
6 1 7 9 3 5
3

B: Субботник - максимальное число бригад

Каждая бригада должна содержать ровно \(K\) человек, а неудобство бригады не должно превышать значения \(M\). Определите наибольшее число бригад, которое можно составить при таких условиях.

Программа получает на вход числа \(N\), \(K\) и \(M\) в первой строке (\(1\le K \le N\le 10^5\), \(M\ge 0\)), во второй строке записано \(N\) натуральных чисел через пробел — значения роста.

Программа должна вывести одно целое число: максимальное количество бригад, которое можно составить из данных людей.

Ввод Вывод
10 3 3
9 1 10 3 12 4 14 5 16 7
2

C: Дюбели и сверла

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

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

Программа должна вывести одно целое число — минимальное значение модуля разности диаметров сверла и дюбеля.

Ввод Вывод
3 2
1 8 15
5 6
2
3 3
1 3 5
3 4 6
0

D: Грузовики

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

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

Программа должна вывести одно число — минимально возможную грузоподъемность грузовика. Если увезти данные грузы на \(M\) грузовиках невозможно, программа должна вывести число -1.

Ввод Вывод
5 4
3 5 3 7 5
7
5 3
3 5 3 7 5
8

E: Подобрать сумму

Дано \(N\) различных целых чисел и целое число \(Q\). Выберите среди данных чисел два числа таких, чтобы их сумма была как можно ближе к \(Q\).

Первая строка входных данных содержит числа \(N\) и \(Q\) (\(2\le N\le 10^5\), \(1\le Q\le 10^9\)). Во второй строке записано \(N\) натуральных чисел, не превосходящих \(10^9\), все числа различные.

Программа должна вывести два числа из данных.

Ввод Вывод
5 10
1 5 8 2 6
2 8
3 10
5 8 6
6 5

F: Калитка в заборе

Забор представляет собой отрезок прямой, левый конец которого имеет координату \(L\), правый конец — координату \(R\). На этом отрезке вкопано \(N\) столбов.

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

Первая строка содержит два целых числа \(N\) и \(W\) — количество вкопанных столбов и минимально необходимую ширину проёма для калитки соответственно. Гарантируется, что \(0\le N\le 30000\) и что \(1\le W\le 60000\).

Во второй строке даны два числа \(L\) и \(R\) — координаты левого и правого конца забора (\(-30000\le L\lt R\le 30000\)). Третья строка содержит \(N\) чисел — координаты вкопанных столбов, расположенные строго на отрезке \([L, R]\). Все координаты, включая \(L\) и \(R\) — различные целые числа.

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

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

Ввод Вывод
3 2
2 6
3 4 5
1
2
3 2
1 6
4 3 5
0
3 5
1 7
5 3 4
3
2 1 3