| | | |
|
Acowdemia III
Множества
Жадный алгоритм
Фермер Джон открыл пастбище с целью помочь Беси и её друзьям.
Пастбище ФД можно рассматривать как большую 2D-решётку квадратных ячеек. Каждая ячейка помечена таким образом:
- C если в ячейке корова
- G если в ячейке трава
- . если в ячейке нет ни коровы, ни травы
Для того, чтобы две различные коровы стали друзьями, коровы должны встретиться в ячейке с травой, которая горизонтально или вертикально соседствует с каждой из них. Во время этого процесса они съедают траву в этой ячейке, поэтому другая пара коров уже не сможет использовать эту ячейку как место встречи. Любая корова может подружиться более чем с одной другой коровой, но никакая пара коров не может встретиться и стать друзьями более одного раза.
ФД надеется, что много пар коров станут друзьями. Определите максимальное количество пар коров, которые могут стать друзьями.
ФОРМАТ ВВОДА:
Первая строка содержит N и M (2 ≤ N,M ≤ 1000).
Каждая из следующих N строк содержит M символов, описывая пастбище.
ФОРМАТ ВЫВОДА:
Определите максимальное количество пар коров, которые могут стать друзьями.
| № |
Входные данные |
Выходные данные |
| 1 |
4 5
.CGGC
.CGCG
CGCG.
.CC.C
|
4 |
Если мы пометим корову в строке i и столбце j координатами (i,j), тогда в этом примере есть коровы в (1,2), (1,5), (2,2), (2,4), (3,1), (3,3), (4,2), (4,3), and (4,5). Один из способов, чтобы 4 коровы стали друзьями таков:
Коровы из (2,2) и (3,3) едят траву в (3,2).
Коровы из (2,2) и (2,4) едят траву в (2,3).
Коровы из (2,4) и (3,3) едят траву в (3,4).
Коровы из (2,4) и (1,5) едят траву в (2,5).
| |
|
|
Год Коровы - 2
Жадный алгоритм
Известно, знаки зодиака в Китайском календаре следуют 12-летнему циклу: Ox, Tiger, Rabbit, Dragon, Snake, Horse, Goat, Monkey, Rooster, Dog, Pig, Rat, и затем опять Ox. Менее известен тот факт, что в конце каждого года Ox открывается временной портал, позволяющий коровам переместиться в любой другой год Ox в прошлом или будущем.
Корова Беси хочет посетить N своих предшественников, которые жили много раньше (\(1<=N<=0x10000\)). 0x10000 - это число в 16-ричной системе счисления, что равно 65536 в десятичной.
К несчастью, путешествия во времени утомительны, и Беси предпочитает сделать не более K прыжков во времени (\(1<=K<=N\)). Помогите Беси определить минимальное количество лет, которое потребуется Беси, чтобы посетить всех предшественников и вернуться в текущий год, совершив не более K прыжков во времени по пути.
Беси не обязана использовать временной потрал в данном году Ox, если не хочет. Временные порталы соединяют первые дни каждого из Ox годов друг с другом, поэтому, например, если Беси использовала временной портал и затем подождала 12 лет следующего временного портала, она потратит ровно 12 лет на процесс. Беси начинает свое путешествие в первый день текущего Ox-года, поэтому она может путешествовать назад. Никто из предшественников Беси не жил в годах Ox.
Входные данные
Первая строка ввода содержит N и K. Следующие N строк содержат N различных целых чисел в интервале \(1…10^9\), указывающих сколько лет назад жил каждый из предшественников Беси.
Выходные данные
Выведите минимальное количество лет, которое потребуется Беси, чтобы посетить всех своих предшественников и вернуться в настоящий год.
Примеры
| № |
Входные данные |
Выходные данные |
Примечание |
| 1 |
5 3
101
85
100
46
95 |
36 |
Один из способов для Беси посетить всех своих предшественников за 36 лет таков:
- Войти в портал в текущем году и вернуться на 48 лет в прошлое.
- Подождать 12 лет затем войтив портал в 36 лет в прошлом и пропутешествовать 108 лет в прошлое.
- Подождать 24 года, затем зайти в портал в 84 года в прошлом и пропутешествовать обратно в текущий год.
|
| |
|
|
Чехарда
Цикл while
Жадный алгоритм
Дорожка замощена плитками в один ряд, плитки пронумерованы числами от 1 до 1000. На плитках с номерами A, B и C (A < B < C) сидят три кузнечика, которые играют в чехарду по следующим правилам:
1. На одной плитке может находиться только один кузнечик.
2. За один ход один из двух крайних кузнечиков (то есть с плитки A или с плитки C) может перепрыгнуть через среднего кузнечика (плитка B) и встать на плитку, которая находится ровно посередине между двумя оставшимися кузнечиками (то есть между B и C или A и B соответственно). Если между двумя оставшимися кузнечиками находится чётное число плиток, то он может выбрать любую из двух центральных плиток.
Например, если кузнечики первоначально сидели на плитках номер 1, 5, 10, то первым ходом кузнечик с плитки номер 10 может перепрыгнуть на плитку номер 3 (она находится посередине между 1 и 5), или кузнечик с плитки номер 1 может перепрыгнуть на плитку номер 7 или 8 (эти две плитки находятся посередине между плитками 5 и 10).
Даны три числа: A, B, C. Определите, какое наибольшее число ходов может продолжаться игра.
Формат входных данных
Программа получает на вход три целых числа A, B и C (1 <= A < B < C <= 1000), записанных в отдельных строках.
Формат выходных данных
Выведите одно число — наибольшее количество ходов, которое может продолжаться игра.
| Ввод |
Вывод |
Примечание |
1
4
6 |
2 |
В примере сначала кузнечик с плитки №6 прыгает на плитку №3. Затем кузнечик с плитки №4 прыгает на плитку №2. |
| |
|
|
Cookie Clicker
Жадный алгоритм
В игре Cookie Clicker игрок зарабатывает печеньки (cookies), щёлкая мышкой по изображению большой печеньки. Тратя заработанные печеньки, игрок может покупать различные усовершенствования (ферму, фабрику и т. д.), которые также производят дополнительные печеньки.
Рассмотрим упрощённый вариант этой игры. Пусть игрок может сделать один щелчок мышкой в секунду, что приносит ему одну печеньку. Также в любой момент времени игрок может потратить C печенек на покупку фабрики (при этом у игрока должно быть не меньше C печенек, после покупки фабрики количество его печенек моментально уменьшается на C ). Каждая купленная фабрика увеличивает ежесекундное производство печенек на P штук (то есть если у игрока одна фабрика, то он получает 1 + P печенек в секунду, две фабрики — 1 + 2 P печенек, три фабрики — 1 + 3 P печенек и т. д.). Игрок может приобрести неограниченное число фабрик стоимостью C печенек каждая. Фабрика начинает производить дополнительные печеньки сразу же, например, если после какой-то секунды игры у игрока стало C печенек, то игрок может купить фабрику и уже на следующей секунде его производство печенек увеличится на P штук.
Оригинальная игра никогда не заканчивается, но мы будем считать, что целью игры является набрать N печенек. Определите минимальное время, за которое может быть достигнута цель игры.
Входные данные
Программа получает на вход три целых положительных числа, записанных в отдельных строках: С (стоимость фабрики), P (производительность одной фабрики) и N (необходимое количество печенек).
Выходные данные
Программа должна вывести одно целое число — минимальное время в секундах, за которое игрок может получить не менее N печенек.
Примеры
| № |
Входные данные |
Выходные данные |
Пояснение |
| 1 |
50
3
100 |
75 |
Через 50 секунд после начала игры у игрока будет 50 печенек, и он сможет купить фабрику. После этого он будет получать 4 печеньки в секунду, и на производство 100 печенек понадобится еще 25 секунд. |
| 2 |
99
10
100 |
100 |
Игрок сможет набрать 100 печенек за 100 секунд, при этом фабрику покупать нет смысла. |
| |
|
|
Округлите равенство
Жадный алгоритм
Вещественные числа
Дано верное равенство вида a1+a2+…+aN=b1+b2+…bM, где a1,a2,…,aN, b1,b2,…,bM – некоторые действительные (не обязательно целые) числа. Требуется «округлить» это равенство, т.е. получить новое верное равенство c1+c2+…+cN=d1+d2+…+dM, где c1,c2,…,cN,d1,d2,…,dM — целые числа, и при этом c1 получено округлением числа a1 до целого вверх или вниз (так, например, число 1.7 разрешается округлить как до 1, так и до 2), c2 получено округлением a2, …, cN – округлением aN, d1 – округлением b1, …, dM – округлением bM. Если какое-то из чисел в исходном равенстве было целым, оно должно остаться без изменений.
Входные данные
Во входном файле задано сначала число N, затем N чисел a1, a2, …, aN, затем число M, затем числа b1, b2, …, bM. Каждое число задается на отдельной строке. M и N – натуральные числа, не превышающие 1000. Остальные числа — вещественные, каждое из них по модулю не превышает 1000 и содержит не более 6 цифр после десятичной точки. При этом a1+a2+…+aN=b1+b2+…bM.
Выходные данные
Если «округлить» равенство можно, то в выходной файл выведите сначала числа c1,c2,…,cN, а затем числа d1,d2,…,dM. Все числа должны быть целыми и выведены без десятичной точки. Числа должны разделяться пробелами или переводами строки. Если решений несколько, выведите любое из них.
Если округлить исходное равенство до верного целочисленного равенства невозможно, выведите одно число 0.
Примеры
| № |
Входные данные |
Выходные данные |
Пояснение |
| 1 |
3
0.15
-3.000
2.7
1
-0.15 |
1
-3
2
0 |
Обратите внимание, что число –3 может округляться только в –3, в то время как 0.15 можно округлить как до 0, так и до 1, 2.7 – до 2 или до 3, –0.15 – до –1 или до 0. Приведенное решение не является единственным: так же верным является, например, такое округление: 1+(–3)+2=0
|
| 2 |
2
1.7
2.5
3
1
2.000
1.20 |
2
2
1
2
1 |
Приведенное решение 1+3=1+2+1 не является единственным. Верными ответами также являются 2+2=1+2+1 и 2+3=1+2+2.
|
| 3 |
1
0.5
1
0.5 |
0
0 |
Здесь верными являются как ответ 1=1, так и 0=0. |
| |
|
|
Взвешивание камней
Алгоритмы сортировки
Дерево отрезков, RSQ, RMQ
Жадный алгоритм
Джек нашел N камней и упорядочил их в порядке возрастания их массы. Массы всех камней различны. Самый легкий камень получил номер 1, следующий ≤ 2 и так далее, самый тяжелый получил номер N.
У Джека есть чашечные весы и он решил положить все камни на них в каком-то порядке. Известен порядок, в котором он будет класть камни, и какой камень на какую чашу попадет.
Ваша задача — определить состояние весов после добавления каждого камня. Точные массы камней не известны — даются только их номера.
Входные данные
Первая строка содержит целое число N (1 N ≤ 100000).
Каждая из следующих N строк содержит по два целых числа: R (1 ≤ R ≤ N) и S (1 ≤ S ≤ 2). R - номер камня, который будет положен на чашу S. Все R будут различны.
Выходные данные
Выведите N строк - по одной для каждого камня. Если после добавления соответствующего камня чаша 1 тяжелее, выведите “<”. Если сторона 2 тяжелее, выведите “>”. Если невозможно определить, в каком состоянии будут весы, выведите “?”.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
5
1 2
3 1
2 1
4 2
5 1 |
<
>
>
?
>
|
| |
|
|
Распродажа
Условный оператор
Жадный алгоритм
Магазины в рекламных целях часто устраивают распродажи. Так, например,одна из крупных сетей магазинов канцелярских товаров объявила два рекламных предложения: "купи N одинаковых товаров и получи еще один товар бесплатно"и "купи K товаров по цене K−1 товара".
Для проведения олимпиады организаторам требуется распечатать условия для участников, на что уходит очень много бумаги. Каждая пачка стоит B рублей. Какое максимальное количество пачек бумаги можно приобрести на A рублей, правильно используя рекламные предложения?
Входные данные
Во входном файле записаны целые числа N, K, A и B (1 ≤ N ≤ 100, 2 ≤ K ≤ 100, 1 ≤ A ≤ 109, 1 ≤ B ≤ 109), разделенные пробелами.
Выходные данные
Выведите одно целое число - максимальное количество пачек бумаги, которое смогут купить организаторы олимпиады.
Примечание
В первом примере, дважды используя второе рекламное предложение, можно купить 8 пачек бумаги, заплатив за 6.
Во втором примере рекламными предложениями воспользоваться нельзя.
В третьем примере можно по одному разу воспользоваться каждым из двух рекламных предложений и на оставшийся рубль купить еще одну пачку бумаги.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
4 4 13 2 |
8 |
| 2 |
3 4 8 3 |
2 |
| 3 |
3 4 7 1 |
9 |
| |
|
|
Автобусы
Сортировка подсчетом
Жадный алгоритм
Сканирующая прямая
Новый Президент Тридевятой республики начал свою деятельность с полной ревизии системы общественного транспорта страны. В результате на основе социологических опросов населения было составлено идеальное ежедневное расписание движения междугородних автобусов, утвержденное Парламентом республики.
Более того, было решено заменить весь автобусный парк одинаковыми новыми, очень дорогими, но гораздо более надежными, красивыми и удобными машинами.
Автобусная сеть страны охватывает N городов, занумерованных целыми числами от 1 до N.
Идеальное расписание содержит M ежедневных рейсов, i-й рейс начинается в городе Fi в момент времени Xi и заканчивается в некотором другом городе Gi в момент времени Yi. Продолжительность каждого рейса ненулевая и строго меньше 24 часов. Рейс i выполняется одним из автобусов, находящихся в момент времени Xi в городе Fi.
Новые автобусы не требуют ремонта и могут работать круглосуточно, поэтому автобус, прибывший в некоторый момент времени в некоторый город, всегда готов в тот же самый момент времени или позже отправиться в путь для обслуживания любого другого рейса из данного города. Автобус может выехать из города, только выполняя какой-либо рейс из расписания.
Предполагается, что расписание будет действовать неограниченное время, поэтому может оказаться так, что его невозможно обслужить никаким конечным числом автобусов.
Определите наименьшее количество новых автобусов, достаточное для обеспечения движения по расписанию в течение неограниченного периода времени.
Входные данные
В первой строке задаются целые числа N и М (1 ≤ N, M ≤ 100 000) — количество городов и рейсов автобусов соответственно.
В каждой из следующих M строк содержится описание рейса автобуса: номер города отправления Fi, время отправления Xi, номер города назначения Gi (Fi ≠ Gi), время прибытия Yi, отделенные друг от друга одним пробелом. Время прибытия и отправления задается в формате HH:MM, где HH — часы от 00 до 23, MM — минуты от 00 до 59.
Выходные данные
Выведите одно число — минимально необходимое количество автобусов. Если расписание невозможно обслуживать в течение неограниченного периода времени конечным числом автобусов, выведите число -1.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
4 6
1 10:00 2 12:00
1 10:00 3 09:00
3 12:00 4 23:00
2 11:00 4 13:00
4 12:00 1 11:00
4 12:00 1 10:30 |
8 |
| |
|
|
То березка, то рябина…
Бинарный поиск в массиве
Бинарный поиск по ответу
Жадный алгоритм
В целях улучшения ландшафтной архитектуры и экологической обстановки управление городского хозяйства разработало проект программы озеленения центрального проспекта. Согласно проекту, с одной стороны проспекта планируется высадить в ряд деревья K различных видов, для чего были закуплены саженцы деревьев, причем i-го вида было закуплено ai саженцев.
Для достижения эстетического совершенства высаживаемого ряда деревьев требуется, чтобы среди любых P подряд идущих деревьев все деревья были разных видов. Если количество деревьев в ряду меньше P, то все они должны быть различны.
Требуется написать программу, которая находит максимальное количество деревьев в эстетически совершенном ряду, посаженном из закупленных саженцев.
Входные данные
В первой строке вводятся два целых числа: K — количество различных видов деревьев (1 ≤ K ≤ 100 000), и P — требуемое количество подряд идущих деревьев разных видов (2 ≤ P ≤ K). Последующие K строк входных данных содержат целые числа ai, задающие количество закупленных саженцев деревьев i-го вида (1 ≤ ai ≤ 109), по одному числу в каждой строке.
Выходные данные
Выведите единственное число — максимальное количество деревьев, посадка которых в ряд в некотором порядке достигает эстетического совершенства.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
3 3
1
200
1 |
4 |
| |
|
|
Эльфы и олени
Эвристические методы
Бинарный поиск по ответу
Быстрая сортировка
Жадный алгоритм
Скоро новый год и Санта-Клаус уже начал готовить свою волшебную оленью упряжку, на которой он развозит подарки детям. Известно, что упряжку везут несколько волшебных оленей, на каждом из которых едут два эльфа.
Но волшебные олени – строптивые животные, поэтому не любые два эльфа могут ехать на любом олене. А именно, каждый олень характеризуется некоторой строптивостью ai, а каждый эльф – темпераментом bi. Два эльфа j и k могут ехать на i-м олене в том и только в том случае, если либо bj < ai < bk, либо bk < ai < bj.
Чтобы его появление было максимально зрелищным, Санта-Клаус хочет, чтобы в его упряжке было как можно больше оленей. Про каждого оленя Санта знает его строптивость, а про каждого эльфа – его темперамент.
Помогите Санте выяснить, какое максимальное количество оленей он сможет включить в упряжку, каких оленей ему следует выбрать, и какие эльфы должны на них ехать.
Входные данные
В первой строке вводятся два целых числа m и n – количество оленей и эльфов, соответственно ( 1 ≤ m, n ≤ 100 000).
Вторая строка содержит m целых чисел ai – строптивость оленей ( 0 ≤ ai ≤ 109). В третьей строке записаны n целых чисел bi – темперамент эльфов ( 0 ≤ bi ≤ 109).
Выходные данные
В первой строке выведите одно число k – максимальное количество оленей, которое Санта-Клаус может включить в свою упряжку. В следующих k строках выведите по три целых числа: di, ei, 1, ei, 2 – для каждого оленя в упряжке выведите его номер и номера эльфов, которые на нем поедут. Если решений несколько, выведите любое.
И эльфы, и олени пронумерованы, начиная с единицы, в том порядке, в котором они заданы во входных данных.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
4 6
2 3 4 5
1 3 2 2 5 2 |
2
1 1 2
3 4 5 |
| |
|
|
Paired Up
"Два указателя"
Жадный алгоритм
Фермер Джон обнаружил, что корову легче доить, если рядом есть другая корова для моральной поддержки. Поэтому он хочет разбить M своих коров (M <= 109, M - чётное) на M/2 пар. Каждую из этих пар он помещает в отдельное стойло, и все пары коров доятся одновременно.
Каждая из коров даёт различное количество молока. Если коровы в паре дают по A и B литров молока, то для дойки этой пары требуется A+B единиц времени.
Помогите ФД определить минимально возможное количество времени на весь процесс дойки, в предположении, что коровы разбиты на пары наилучшим образом.
Входные данные
Первая строка ввода содержит N (1 <= N <= 100000). Каждая из следующих N строк содержит два целых числа x и y, указывающих, что у ФД есть x коров с производством молока по y (1 <= y <= 109) литров. Сумма всех x-ов есть M- общее количество коров.
Выходные данные
Выведите минимальное количество времени, которое займёт дойка всех коров, в предположении, что они разбиты на пары оптимальным образом.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
3
1 8
2 5
1 2
|
10 |
| |
|
|
Том Сойер и слово на заборе
Хеш
Жадный алгоритм
Префиксные суммы(минимумы, ...)
Во время покраски забора Том Сойер написал на нем слово s. Однако затем он решил, что слова-палиндромы смотрятся красивее.
Теперь он хочет дописать к имеющемуся слову s справа другое слово g так, чтобы получившееся слово sg было палиндромом. Однако в целях экономии краски длина g должна быть как можно меньше.
Помогите Тому Сойеру определить слово g.
Входные данные:
В первой строке дано слово s (1 <= |s| <= 200000), состоящее из строчных латинских букв.
Выходные данные:
Выведите минимально возможное по длине слово g, которое нужно дописать, чтобы слово sg на заборе стало палиндромом. Если дописывать ничего не надо, то выведите '-'.
Примеры:
| Входные данные |
Выходные данные |
| abc |
ba |
| a |
- |
| |
|
|
Межрегиональная олимпиада
Бинарный поиск в массиве
Динамическое программирование
Жадный алгоритм
На межрегиональной олимпиаде по программированию роботов соревнования проводятся в один тур и в необычном формате. Задачи участникам раздаются последовательно, а не все в самом начале тура, и каждая i-я задача (1 ≤ i ≤ n) становится доступной участникам в свой момент времени si. При поступлении очередной задачи каждый участник должен сразу определить, будет он ее решать или нет. В случае, если он выбирает для решения эту задачу, то у него есть ti минут на то, чтобы сдать ее решение на проверку, причем в течение этого времени он не может переключиться на решение другой задачи. Если же участник отказывается от решения этой задачи, то в будущем он не может к ней вернуться. В тот момент, когда закончилось время, отведенное на задачу, которую решает участник, он может начать решать другую задачу, ставшую доступной в этот же момент, если такая задача есть, или ждать появления другой задачи. При этом за правильное решение i-й задачи участник получает ci баллов.
Артур, представляющий на межрегиональной олимпиаде один из региональных центров искусственного интеллекта, понимает, что важную роль на такой олимпиаде играет не только умение решать задачи, но и правильный стратегический расчет того, какие задачи надо решать, а какие пропустить. Ему, как и всем участникам, до начала тура известно, в какой момент времени каждая задача станет доступной, сколько времени будет отведено на ее решение и сколько баллов можно получить за ее решение. Артур является талантливым школьником и поэтому сможет успешно решить за отведенное время и сдать на проверку любую задачу, которую он выберет для решения на олимпиаде.
Требуется написать программу, которая определяет, какое максимальное количество баллов Артур сможет получить при оптимальном выборе задач, которые он будет решать, а также количество и перечень таких задач.
Входные данные
Первая строка содержит одно целое число n (1 ≤ n ≤ 105) количество задач на олимпиаде.
Последующие n строк содержат описания задач, по три числа на каждой строке: si момент появления i-й задачи в минутах, ti время, отведенное на ее решение в минутах, и ci сколько баллов получит участник за решение этой задачи (1 ≤ si, ti, ci ≤ 109).
Выходные данные
Первая строка должна содержать одно число – максимальное количество баллов, которое сможет получить Артур на олимпиаде.
Вторая строка должна содержать одно целое число m - количество задач, которые надо решить при оптимальном выборе.
Третья строка должна содержать m разделенных пробелом целых чисел - номера этих задач в порядке их решения. Задачи пронумерованы, начиная с единицы, в порядке их описания во входном файле.
Если оптимальных ответов несколько, необходимо вывести любой из них.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
2
1 1 1
2 2 2 |
3
2
1 2 |
| 2 |
3
1 2 1
3 2 1
2 4 3 |
3
1
3 |
| |
|
|
Мультимножество и XORы
Жадный алгоритм
Бор
У вас есть q запросов и мультимножество A, изначально содержащее только число 0. Запросы бывают трёх видов:
- + x — добавить в мультимножество A число x.
- - x — удалить одно вхождение числа x из мультимножества A. Гарантируется, что хотя бы одно число x в этот момент присутствует в мультимножестве.
- ? x — вам даётся число x, требуется вычислить максимальное значение побитового исключающего ИЛИ (также известно как XOR) числа x и какого-нибудь числа y из мультимножества A.
Мультимножество — это множество, в котором разрешается несколько одинаковых элементов.
Входные данные:
В первой строке входных данных содержится число q (1 ≤ q ≤ 200000) — количество запросов, которые требуется обработать Василию.
Каждая из последующих q строк входных данных содержит один трёх символов «+», «-» или «?» и число xi (1 ≤ xi ≤ 109). Гарантируется, что во входных данных встречается хотя бы один запрос «?».
Обратите внимание, что число 0 всегда будет присутствовать в мультимножестве.
Выходные данные:
На каждый запрос типа «?» выведите единственное целое число — максимальное значение побитового исключающего ИЛИ для числа xi и какого-либо числа из мультимножества A.
Пример:
| Входные данные |
Выходные данные |
10
+ 8
+ 9
+ 11
+ 6
+ 1
? 3
- 8
? 3
? 8
? 11 |
11
10
14
13 |
| |
|
|
Короткий код
Бор
Жадный алгоритм
Деревья
Код Эвана содержит n переменных. Каждая переменная имеет уникальное имя, состоящее только из английских строчных (маленьких) букв. Однажды Эван решил укоротить свой код.
Он хочет заменить имя каждой переменной его непустым префиксом таким образом, что новые имена останутся попарно различными (но новое имя какой-либо переменной может совпадать со старым именем этой или другой переменной). Среди всех таких возможных замен он хочет найти такую, для которой суммарная длина названий переменных будет минимальной.
Строка a является префиксом строки b, если вы можете удалить несколько (возможно, ни одного) символа с конца строки b и получить a.
Найдите минимальную возможную суммарную длину новых имён.
Входные данные:
В первой строке содержится одно целое число n (1 ≤ n ≤ 105) — число переменных в коде Эвана.
Следующие n строк содержат названия переменных по одному на строку. Каждое название не является пустой строкой и содержит только лишь строчные (маленькие) английские буквы. Суммарная длина всех этих строк не больше 105. Все названия переменных различны.
Выходные данные:
Выведите одно целое число — минимально возможную суммарную длину новых названий переменных.
Примеры:
| Входные данные |
Выходные данные |
3
codeforces
codehorses
code |
6 |
5
abba
abb
ab
aa
aacada |
11 |
3
telegram
digital
resistance |
3 |
Пояснения:
В первом примере одним из наилучших вариантов будет сокращение имён в порядке их ввода до "cod", "co", "c".
Во втором примере можно укоротить последнее имя до "aac" и первое имя до "a" без изменения других имён переменных.
| |
|
|
Сортировщик Томми
"Два указателя"
Жадный алгоритм
Конструктив
У Томми есть детская игрушка «cортировщик», с расположенными подряд n колышками. На каждом колышке сейчас не более одного диска (то есть на каком-то колышке диск есть, а на каком-то его нет). Томми хочет переложить имеющиеся диски на колышках таким образом, чтобы они образовывали неубывающую последовательность при просмотре слева направо. То есть на каждом следующем колышке количество дисков должно быть не меньше, чем на предыдущем. Какое минимальное количество дисков Томми необходимо переложить?
Обратите внимание, что какие- то колышки по окончанию сортировки могут быть пустыми. Какие-то колышки могут содержать более 1 диска.
Входные данные
Программа получает на вход в первой строке целое число n (1 <= n <= 105), количество колышек на «cортировщике». Следующая строка содержит n целых чисел a1, a2, ... an – наличие диска на соответствующем колышке (0 <= ai <= 1). число 0 означает, что на i-м колышке нет диска, 1 – диск есть.
Выходные данные
Выведите ответ на задачу.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
8
0 0 1 1 1 1 1 1
|
0
|
| 2 |
11
1 1 0 0 1 0 0 1 1 1 0
|
3
|
| |
|
|
Радостная фигура
Использование сортировки
Жадный алгоритм
Маленький Миша любит играть счетными палочками. Счетные палочки он берет у своей сестры первоклассницы. Так как он редко возвращает их назад, маме приходится часто покупать новые палочки. Поэтому не все палочки у Миши одинаковые, но все палочки имеют целочисленную длину.
Сегодня Миша строит из палочек следующую фигуру. Он начал из угла комнаты. Мы с вами обозначим, условно, этот угол координатой (0, 0). Дальше Миша выкладывает палочку параллельно одной из двух стен, исходящей из данного угла. Будем считать, что стены ровные и образуют друг с другом в точке (0, 0) угол 90 градусов. При этом, Миша никогда не выкладывает две подряд палочки одновременно параллельно одной и той же стене (другими словами, он всегда чередует направление палочек).
Миша, хоть и маленький и не знает геометрии, но все же всегда радуется, если конец его фигуры находится как можно дальше от стартового угла. Помогите Мише выложить фигуру, которая его обрадует. Любые две палочки, которые выкладывает Миша всегда имеют минимум одну точку касания или пересечения.
Входные данные
Программа получает на вход несколько строк. Первая строка содержит целое число n (1<= n <= 100000) — количество палочек, которые есть у Миши. Вторая строка содержит n целых чисел a1,...,an (1 <= ai <= 10000) - длины Мишиных палочек.
Выходные данные
Выведите одно целое число — квадрат максимального расстояния от угла с координатой (0,0) до конечной точки фигуры, которую построил Миша.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
3
1 2 3 |
26 |
| 2 |
4
1 1 2 2 |
20 |
| |
|
|
Мишины кубики
Использование сортировки
Жадный алгоритм
Задача на реализацию
Простые задачи на перебор
"Два указателя"
У маленького Миши есть кубики, на каждом из которых написана одна английская строчная буква. Вчера он выкладывал кубики в два ряда. В первом ряду у Миши n кубиков с буквами, во втором - m кубиков с буквами. Так получилось, что в двух этих рядах нет совпадающих букв. Другими словами, ни одна буква не содержится одновременно в обоих рядах.
Сегодня маленький Миша решил продолжить играть с кубиками. Но теперь он берет один любой кубик из какого-либо ряда и составляет из них третий ряд, добавляя кубик всегда в конец. Маленький Миша никогда не берет более k кубиков подряд из одного и того же ряда. Миша закончил играть тогда, когда у него закончились кубики в каком-то одном ряду (в первом или во втором).
Наблюдавший за игрой папа заметил, что играя таким образом у Миши получилась лексикографически наименьшая строка. По известным двум строкам, которые образуются путем прочтения букв первого и второго ряда и числу k определите строку, которую получил маленький Миша.
Строка x лексикографически меньше строки y только и только тогда, когда выполняется одно из следующих условий:
- x является префиксом y, но x != y;
- в первой позиции, где x и y различаются, в строке x находится буква, которая стоит в алфавите раньше, чем соответствующая буква y.
Входные данные
Программа получает на вход несколько строк. В первой строке записаны три числа: n - количество кубиков в первом ряду, m - количество кубиков во втором ряду, k - целое число(1 <= n, m, k <= 100). Во второй строке записана строка a длиной n - строка, образованная прочтением букв, написанных на кубиках первого ряда. В третьей строке - строка b длиной m - строка, образованная прочтением букв, написанных на кубиках второго ряда.
Выходные данные
Выведите ответ на задачу.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
6 4 2
aaaaaa
bbbb |
aabaabaa |
| |
|
|
Максимус спасает Элстейд
Жадный алгоритм
Массивы
Алгоритмы сортировки
Одарённый невероятной магией и всезнанием Максимус заметил группу из n монстров, приближающихся к городку Элдстейд. Своими волшебными способностями он мгновенно определил расстояние в километрах от города до каждого монстра. Он также заметил, что все монстры двигаются с постоянной скоростью. У Максимуса есть оружие, способное уничтожить одного монстра после полной зарядки. Зарядка занимает ровно одну минуту. Чтобы победить монстра, оружие должно быть полностью заряжено к моменту приближения монстра к городу. Другими словами, невозможно убить монстра достигшего города, даже если в этот момент оружие закончило полную зарядку.
Максимус задается вопросом, сможет ли он сам спасти город от всех монстров или ему нужна помощь.
Напишите программу, которая поможет Максимусу мгновенно определить максимальное количество монстров, которое он сможет уничтожить до того момента, как хотя бы один монстр достигнет города.
Входные данные
Первая строка содержит число n - количество монстров. Во второй строке записано n чисел dist[i] - начальное расстояние в километрах от города для i-го монстра. Третья строка содержит n чисел speed[i] - скорость i-го монстра в километрах в минуту.
Ограничения
n == длина массива dist == длина массива speed
1 <= n <= 105
1 <= dist[i], speed[i] <= 105
Выходные данные
Выведите ответ на задачу.
Примеры
| № |
Входные данные |
Выходные данные |
Примечание |
| 1 |
3
1 3 4
1 1 1
|
3
|
Вначале расстояния между монстрами равны [1,3,4]. Максимус уничтожает первого монстра.
Через минуту расстояния между монстрами становятся [X,2,3]. Максимус уничтожает второго монстра.
Через минуту расстояния между монстрами будут [X,X,2]. Максимус уничтожает третьего монстра.
Все три монстра могут быть уничтожены.
|
| 2 |
4
1 1 2 3
1 1 1 1
|
1
|
Вначале расстояния между монстрами равны [1,1,2,3]. Максимус уничтожает первого монстра.
Через минуту расстояния между монстрами становятся равными [X,0,1,2], и второй монстр достиг города.
Максимус может уничтожить только 1 монстра. |
| |
|
|
Вечер кёрлинга
Жадный алгоритм
Использование сортировки
Сегодня вечером по телевизору на разных каналах будут показывать n матчей по кёрлингу, причём i-й матч начинается в момент времени li и заканчивается в момент времени ri.
Василиса хочет посмотреть как можно больше матчей от начала до конца. При этом если какой-то матч заканчивается в момент времени ri, то она может после него посмотреть любой матч j, который начинается не раньше момента времени ri, то есть lj > ri (Василиса может моментально переключить каналы в момент окончания матча и начать смотреть новый матч). Также она хочет сделать перерыв длины хотя бы t между какими-то двумя играми, чтобы поужинать, то есть должны найтись два последовательных матча i и j, которые просмотрит Василиса, удовлетворяющие условию lj - ri => t. Перерыв не может быть до или после всех просмотренных игр.
Помогите Василисе составить набор, содержащий максимальное количество матчей, которые она сможет просмотреть полностью и при этом сделать перерыв продолжительностью не менее t между какими-то матчами, или определите, что такого набора не существует.
Формат входных данных
Первая строка входных данных содержит число n (2 ≤ n ≤ 100 000) - количество показываемых матчей.
Вторая строка входных данных содержит число t (1 ≤ n ≤ 109) - минимальная длина перерыва, который должна сделать Василиса.
В следующих n строках содержится по два числа li и ri ( 1 ≤ li < ri ≤ 109) - начало и конец i-го матча.
Формат выходных данных
Программа должна вывести число m - максимально возможное количество матчей, которые просмотрит Василиса. Во второй строке выведите m чисел через пробел - номера матчей, которые должна посмотреть Василиса, в порядке просмотра.
Если Василиса не может составить расписание хотя бы из двух матчей так, чтобы между какими-то двумя матчами был перерыв хотя бы t, то выведите число -1.
Замечание
В первом примере ответом будет последовательность матчей 6, 3, 5. Василиса сначала посмотрит матч 6,
который заканчивается в момент времени 4, потом переключится на матч 3, который продолжается с 4 до 6.
Затем она сделает перерыв с 6 по 10, после чего просмотрит матч номер 5 с 10 до 12. Получилось расписание из 3 матчей с перерывом, продолжительность которого равна 4. Заметим, что в данном примере правильным ответом также будет последовательность матчей 6, 4, 5, в этом случае продолжительность перерыва между матчами 4 и 5 будет равна 3.
Во втором примере всего два матча, первый заканчивается в 5, а второй начинается в 9, то есть составить расписание, в котором был бы перерыв продолжительностью не менее t=5, нельзя.
| |
|
|
Пазл
Паросочетания
Жадный алгоритм
Динамическое программирование
Динамическое программирование
Участникам, использующим язык Python3, рекомендуется отправлять решения на проверку с использованием интерпретатора PyPy3.
Школьники Алиса и Ибрагим — лучшие друзья. У Ибрагима скоро день рождения, и по этому поводу Алиса решила подарить ему новый пазл. Пазл можно представить в виде матрицы из \(2\) строк и \(n\) столбцов, каждый элемент которой \(0\) или \(1\). За один ход можно поменять местами два элемента, стоящие в соседних клетках.
Более формально, будем считать, что строки матриц пронумерованы сверху вниз от \(1\) до \(2\), а столбцы — слева направо от \(1\) до \(n\). Обозначим клетку на пересечении строки \(x\) и столбца \(y\) за \((x, y)\). Будем считать две клетки \((x_1, y_1)\) и \((x_2, y_2)\) соседними, если \(|x_1 - x_2| + |y_1 - y_2| = 1\).
Алисе не нравится, какой рисунок образуют клетки пазла в данный момент. Она придумала свой рисунок, с которым и планирует подарить Ибрагиму новый пазл, но для этого нужно привести пазл в соответствующее состояние.
В конце учебного года у Алисы очень плотное расписание, и она не хочет тратить на эту задачу много времени. Помогите Алисе найти минимальное количество ходов, за которое она может получить свой рисунок, или скажите, что это невозможно.
Формат входных данных
В первой строке вводится одно целое число \(n\) (\(1 \leq n \leq 200\,000\)) — количество столбцов в пазле.
Следующие две строки описывают рисунок, образованный пазлом в данный момент. В каждой строке вводятся \(n\) целых чисел, каждое из которых равно \(0\) или \(1\).
Следующие две строки описывают желаемый рисунок Алисы в том же формате.
Формат выходных данных
Если Алиса не ошиблась и её рисунок можно получить, найдите и выведите минимальное необходимое количество ходов, иначе выведите \(-1\).
В первом примере из условия подойдет следующая последовательность обменов:
\((2, 1), (1, 1)\)
\((1, 2), (1, 3)\)
\((2, 2), (2, 3)\)
\((1, 4), (1, 5)\)
\((2, 5), (2, 4)\)
Можно показать, что меньшим числом обменов обойтись нельзя, поэтому ответ равен \(5\).
Во втором примере из условия никакая последовательность ходов не приводит пазл к нужному виду.
| |
|
|
Fenced In
Алгоритмы сортировки
Жадный алгоритм
Коровы Фермера Джона боятся больших пространств. Поэтому разгородил своё поле на некоторое количество маленьких регионов, построив вертикальные (север-юг) и горизонтальные (восток-запад) изгороди.
Поле представляет собой прямоугольник с угловыми вершинами в точках (0,0) and (A,B). ФД построил n вертикальных изгородей (0≤n≤25,000) в различных позициях a1…an (0<ai<A); каждая изгородь проходит от точки (ai,0) до точки (ai,B). Он также построил m горизонтальных изгородей (0≤m≤25,000) в в различных позициях b1…bm (0<bi<B); каждая изгородь, проходит из (0,bi) в (A,bi). Каждая вертикальная изгородь пересекается с каждой горизонтальной изгородью, разделив поле на (n+1)(m+1) регионов.
К несчастью, ФД забыл построить ворота в своих изгородях, сделав невозможным коровам покидать свой регион. Он хочет исправить ситуацию, удалив куски изгороди, чтобы позволить коровам перемещаться между соседними регионами. Он хочет выбрать некоторые пары соседних регионов и удалить всю длину изгороди между ними. А ещё он хочет обеспечить, чтобы коровы могли попасть в любую часть поля.
Например, ФД мог построить изгороди так:
+---+--+
| | |
+---+--+
| | |
| | |
+---+--+
и открыть их так:
+---+--+
| |
+---+ +
| |
| |
+---+--+
Помогите ФД определить минимальную суммарную длину изгородей, которые он должен удалить, чтобы достичь своей цели.
ФОРМАТ ВВОДА:
Первая строка ввода содержит числа A, B, n, and m (1≤A,B≤1,000,000,000). Следующие n строк содержат a1…an. Следующие m строк содержат b1…bm.
ФОРМАТ ВЫВОДА:
Выведите минимальную длину изгороди, которую ФД должен удалить. Заметим что это число может не поместиться в 32-битное целое и Вам нужно использовать 64-битное целое (например, "long long" в C/C++ )
| Ввод |
Вывод |
|
15 15 5 2
2
5
10
6
4
11
3
|
44 |
| |
|
|
Чтение книг
Бинарный поиск по ответу
Жадный алгоритм
Использование сортировки
У Максима есть n книг различных жанров. В i-й книге ai страниц. Сегодня он хочет прочитать не менее xj страниц, при этом, чтобы не запутаться в историях, он хочет прочитать как можно меньше книг.
Помогите Максиму определить минимальное количество книг, которые он должен прочитать, чтобы общее число прочитанных страниц было не менее xj. Если это невозможно, выведите -1. Максим не может читать одну и ту же книгу дважды.
Формат входных данных
Первая строка содержит натуральное число n (1 ≤ 𝑛 ≤ 105) - количество книг, которые есть у Максима. Вторая строка содержит n целых чисел a1, a2, ..., an (1≤ ai ≤104) - количество страниц в i-й книге. Третья строка содержит натуральное число xj (1 ≤ xj ≤ 2⋅109) - количество страниц, которое хочет прочитать Максим.
Формат выходных данных
Выведите ответ на задачу.
| |
|
|
Стабильные параллели
Жадный алгоритм
Паша и Тёма приехали преподавать в зимний ноутбучный университет. Теперь им необходимо разобраться с учениками.
Есть \(n\) учеников, пронумерованных от \(1\) до \(n\). Уровень знаний \(i\)-го ученика равен \(a_i\). Всех учеников нужно распределить на стабильные параллели. Параллель называется стабильной, если после сортировки всех учеников параллели в порядке возрастания их уровня знаний у любых двух подряд идущих учеников разница уровня знаний не превосходит \(x\).
Преподаватели достаточно находчивые люди, поэтому они могут пригласить не более \(k\) дополнительных учеников с любым требуемым уровнем знаний. Определите минимальное число стабильных параллелей, на которые можно распределить всех учеников (возможно, пригласив не более \(k\) новых учеников).
Формат входных данных
В первой строке вводятся три целых числа \(n\), \(k\), \(x\) (\(1 \le n \le 200\,000, 0 \le k \le 10^{18}, 1 \le x \le 10^{18}\)) — количество учеников, сколько учеников можно пригласить дополнительно и максимальная допустимая разница уровня знаний.
Во второй строке вводится \(n\) целых чисел \(a_1, a_2, \dots, a_n\) (\(1 \le a_i \le 10^{18}\)) — уровни знаний учеников.
Формат выходных данных
В единственной строке выведите одно число — искомое минимальное число стабильных параллелей, на которое можно разбить учеников.
Примечание
В первом примере из условия можно пригласить учеников с уровнями знаний, равными \(2\) и \(11\). Тогда учеников можно разделить на следующие стабильные параллели:
-
\([1, 1, 2, 5, 8, 11, 12, 13]\),
-
\([20, 22]\).
Во втором примере из условия новых учеников приглашать нельзя, поэтому потребуется \(3\) параллели:
-
\([1, 1, 5, 5, 20, 20]\)
-
\([60, 70, 70, 70, 80, 90]\)
-
\([420]\)
| |
|
|
PriceFixed
Жадный алгоритм
"Два указателя"
Девочка Лена — самая экономная девочка в Москве. Поэтому когда папа поручил ей закупку продуктов для поездки на дачу, она сразу отправилась в самый лучший магазин — <<PriceFixed>>. У этого магазина есть несколько особенностей:
-
В магазине есть бесконечный запас каждого товара.
-
Все товары в нем стоят одинаково — ровно 2 рубля.
-
Для каждого из \(i\) товаров предусмотрена скидка для опытных покупателей: если вы уже приобрели \(b_i\) товаров (любого типа, не обязательно типа \(i\)), то на все последующие покупки \(i\)-го товара будет действовать скидка \(50\%\) (то есть, \(i\)-й товар можно будет покупать за 1 рубль!).
Лене нужно купить \(n\) товаров: \(i\)-го товара нужно купить \(a_i\) штук. Помогите Лене понять, какую минимальную сумму денег ей нужно будет потратить, если она будет выбирать порядок покупки товаров оптимальным образом.
Формат входных данных
В первой строке вводится число \(n\) \((1 \leq n \leq 100\,000)\) — количество различных товаров в списке.
В следующих \(n\) строках вводятся описания товаров. Каждое описание состоит из двух чисел \(a_i\) и \(b_i\), (\(1 \leq a_i \leq 10^{14}\), \(1 \leq b_i \leq 10^{14}\)) — требуемое число товаров типа \(i\) и сколько товаров нужно купить, чтобы получить скидку на товар \(i\).
Сумма всех \(a_i\) в тесте не превосходит \(10^{14}\).
Формат выходных данных
Выведите искомую минимальную сумму, которая требуется Лене для совершения всех покупок.
Примечание
В первом примере из условия Лена может купить товары в таком порядке:
-
единицу товара 3 за 2 рубля,
-
единицу товара 1 за 2 рубля
-
единицу товара 1 за 2 рубля,
-
единицу товара 2 за 1 рубль (она может купить его со скидкой, так как уже куплено 3 товара),
-
единицу товара 1 за 1 рубль (она может купить его со скидкой, так как уже куплено 4 товара).
Суммарно она потратит 8 рублей. Можно показать, что меньше потратить невозможно.
Во втором примере из условия Лена может купить товары в таком порядке:
-
единицу товара 1 за 2 рубля,
-
две единицы товара 2 по 2 рубля за каждую,
-
единицу товара 5 за 2 рубля,
-
единицу товара 3 за 1 рубль,
-
две единицы товара 4 по 1 рублю за каждую,
-
единицу товара 1 за 1 рубль.
Суммарно при таком порядке приобретения товаров Лена потратит 12 рублей.
| |
|
|
Решение задач
Жадный алгоритм
Алгоритмы сортировки
В этой задаче Вася готовится к олимпиаде. Учитель дал ему \(N\) (\(1 \le N \le 100\)) задач для тренировки. Для каждой из этих задач известно, каким умением \(a_i\) нужно обладать для её решения. Это означает, что если текущее умение Васи больше либо равно заданного умения для задачи, то он может ее решить. Кроме того, после решения \(i\)-й задачи Васино умение увеличивается на число \(b_i\).
Исходное умение Васи равно \(A\). Решать данные учителем задачи он может в произвольном порядке. Какое максимальное количество задач он сможет решить, если выберет самый лучший порядок их решения?
Формат входных данных
Сначала вводятся два целых числа \(N\), \(A\) (\(1 \le N \le 100\), \(0 \le A \le 100\)) — количество задач и исходное умение. Далее идут \(N\) пар целых чисел \(a_i\), \(b_i\) (\(1 \le a_i \le 100\), \(1 \le b_i \le 100\)) — соответственно сколько умения нужно для решения \(i\)-й задачи и сколько умения прибавится после её решения.
Формат выходных данных
Выведите одно число — максимальное количество задач, которое Вася может решить.
Примечание
В первом тесте Вася сможет решить все задачи, выбрав, например, порядок 2, 1, 3. Во втором тесте ему необходимо сначала разобраться с 1 и 3 задачами, после чего он осилит 2.
| |
|
|
Робот
Жадный алгоритм
Робот должен выполнить \(n\) заданий.
Робот начинает работать в первый день и каждый день может выполнить ровно одну работу. Про каждую работу известен последний день, когда ее можно выполнить \(d_i\), и штраф \(w_i\), который придется заплатить, если работа не будет выполнена в срок.
Помогите роботу решить, в каком порядке выполнять работы, чтобы суммарный штраф был как можно меньше.
Например, если есть 3 работы, первую необходимо выполнить в первый день и штраф за невыполнение 2, вторую также необходимо выполнить в первый день и штраф за невыполнение 3, а третью необходимо выполнить не позже третьего дня и штраф за невыполнение 1, то оптимально выполнить сначала вторую, потом третью, а затем первую работу. В этом случае не в срок выполнено только первая работа и штраф составляет 2. Выполнить одновременно первую и вторую работу в срок невозможно.
Формат входных данных
В первой строке дано единственное натуральное число \(n\) (\(1 \le n \le 200\,000\)) — количество работ.
Затем следует \(n\) строк, в каждой из которых содержится по два числа \(d_i\) и \(w_i\) (\(1 \le d_i \le 200\,000\), \(1 \le w_i \le 200\,000\)) — последний день, когда можно выполнить работу без штрафа и стоимость опоздания для \(i\)-й работы.
Формат выходных данных
В первой строке выведите единственное число, равное минимальной возможному суммарному штрафу. Во второй строке через пробел выведите \(n\) чисел, где \(i\)-е число — день, в который необходимо выполнить \(i\)-ю работу.
Если возможно несколько оптимальных расписаний, выведите любое из них.
В приведенном робот выполняет в срок вторую и третью работы, а первую выполняет лишь во второй день. Поэтому ему приходится уплатить штраф величиной 2.
| |
|
|
Приключение
Жадный алгоритм
Динамическое программирование на таблицах
Теплым весенним днем группа из N школьников-программистов гуляла в окрестностях города Кисловодска. К несчастью, они набрели на большую и довольно глубокую яму. Как это случилось — непонятно, но вся компания оказалась в этой яме.
Глубина ямы равна H. Каждый школьник знает свой рост по плечи hi и длину своих рук li. Таким образом, если он, стоя на дне ямы, поднимет руки, то его ладони окажутся на высоте hi + li от уровня дна ямы. Школьники могут, вставая друг другу на плечи, образовывать вертикальную колонну. При этом любой школьник может встать на плечи любого другого школьника. Если под школьником i стоят школьники j1, j2, …, jk, то он может дотянуться до уровня hj1 + hj2 + … + hjk + hi + li.
Если школьник может дотянуться до края ямы (то есть hj1 + hj2 + … + hjk + hi + li ≥ H), то он может выбраться из нее. Выбравшиеся из ямы школьники не могут помочь оставшимся.
Найдите наибольшее количество школьников, которые смогут выбраться из ямы до прибытия помощи, и перечислите их номера.
Формат входных данных
В первой строке входных данных задается натуральное число N (1 ≤ N ≤ 2000) — количество школьников, попавших в яму.
Далее в N строках содержится по два целых числа: рост i-го школьника по плечи hi (1 ≤ hi ≤ 105) и длина его рук li (1 ≤ li ≤ 105).
В последней строке указано целое число — глубина ямы H (1 ≤ H ≤ 105).
Формат выходных данных
В первой строке выведите K — максимальное количество школьников, которые смогут выбраться из ямы. Если K > 0, то во второй строке в произвольном порядке выведите их номера, разделяя их пробелами. Школьники нумеруются с единицы в том порядке, в котором они заданы во входных данных. Если существует несколько решений, выведите любое.
| |
|
|
Курьер
Использование сортировки
Жадный алгоритм
Курьеру Васе поручили доставить n посылок. Вася начинает работать в первый день и каждый день может доставить ровно одну посылку. Про каждую посылку известен последний день, когда ее можно доставить di, и штраф wi, который придется заплатить, если посылка не будет доставлена в срок.
Помогите Васе решить, в каком порядке доставлять посылки, чтобы суммарный штраф был как можно меньше.
Например, если есть 3 посылки, первую необходимо доставить в первый день и штраф за опоздание 2, вторую также необходимо доставку в первый день и штраф за опоздание 3, а третью необходимо доставить не позже третьего дня и штраф за опоздание 1, то оптимально доставить сначала вторую, потом третью, а затем первую посылку. В этом случае не в срок доставлена только первая посылка и штраф составляет 2. Доставить одновременно первую и вторую посылку в срок невозможно.
Формат ввода
Формат вывода
В первой строке выведите единственное число, равное минимально возможному суммарному штрафу. Во второй строке через пробел выведите n чисел, где i-е число — день, в который необходимо доставить i-ю посылку.
Если возможно несколько оптимальных расписаний, выведите любое из них.
Пример
| Ввод |
Вывод |
3
1 2
1 3
3 1
|
2
3 1 2
|
| |
|
|
Счастливые билеты
Жадный алгоритм
На автобусных билетах указываются их номера. Номера всех билетов всегда записываются при помощи одного и того же количества цифр, при этом число используемых цифр чётно. При необходимости числа дополняются ведущими нулями. К примеру, если для записи используют 4 цифры, то 514 будет записано как 0514. Билеты отпечатаны на лентах, билеты на каждой ленте нумеруются подряд числами от 00...01 до 99...99.
Счастливым считается тот билет, у которого сумма цифр первой половины равна сумме цифр второй половины, например, билеты 1001 и 123051 счастливые, а 7778 и 39 – нет. Сегодня Дима зашел в автобус, и кондуктор выдал ему билет с номером N. Поскольку Диме ехать достаточно долго, а заняться чем-нибудь надо, он стал думать, какой номер будет иметь следующий счастливый билет, выданный из той же ленты, что и Димин билет. Если в текущей ленте не осталось счастливых билетов, Диму интересует номер минимального счастливого билета из новой ленты.
В первой и единственной строке входного файла содержится номер Диминого билета N, записанный с ведущими нулями. Количество цифр в записи числа N не превосходит 100 000 и чётно.
Программа должа вывести номер следующего счастливого билета из текущей ленты в таком же формате. Если такого билета не существует, надо вывести номер минимального счастливого билета из новой ленты. В выводе не должно быть пробелов, пустых строк в начале вывода.
| Ввод |
Вывод |
Примечание |
| 0514 |
0523 |
Диме был выдан счастливый билет (сумма цифр обеих половин равна 5), но Диму не интересует номер его билета, его интересует номер следующего счастливого билета. |
| |
|
|
Самокат
Жадный алгоритм
Линейные алгоритмы
В городе Новый Нижгород открылась новая служба доставки еды с оригинальным названием <<Камосат>>. Курьеры этой службы передвигаются на самокатах и стремятся максимально эффективно доставлять заказы клиентам.
Для того чтобы упростить задачу планирования маршрутов, был разработан алгоритм, основанный на топографии города. Город расположен вдоль реки, поэтому его можно представить одномерным массивом, где каждый элемент массива — это высота местности в соответствующей точке. Расстояние между двумя соседними точками считается равным \(1\).
Каждый курьер начинает свой маршрут в некоторой точке города. Он может двигаться только вправо (по увеличению номеров элементов массива) и посещать только те точки, где высота меньше, чем в точке старта. Курьер стремится проехать как можно дальше, учитывая данное условие. Курьер, встретив местность не ниже, чем точка старта, не может продолжить путь.
Помогите курьерам определить длину максимального маршрута, по которому они могут проехать, выбрав произвольную точку старта.
Формат входных данных
Первая строка содержит одно целое число \(n\) (\(2 \leq n \leq 300\,000\)) — количество точек в городе.
Вторая строка содержит \(n\) целых чисел \(h_1, h_2, \ldots, h_n\) (\(-10^9 \leq h_i \leq 10^9\)) — высоты точек города.
Формат выходных данных
Выведите одно целое число — максимальное расстояние, которое может преодолеть курьер.
Замечание
В первом примере курьер может стартовать в третьей точке с высотой \(6\) и проехать по высотам \(6\rightarrow2\rightarrow1\).
Во втором примере курьер не может никуда проехать, потому что можно посещать только те точки, где высота меньше, чем в точке старта.
В третьем примере курьер может проехать по высотам \(5\rightarrow2\rightarrow3\rightarrow4\).
| |
|
|
Оптимизация акции
Динамическое программирование
Рекурсия
Жадный алгоритм
В сети магазинов <<Мир>> при оплате карточкой Weeza действует акция. При оплате покупки, состоящей не менее чем из \(10\) товаров, плата за самый дешевый товар не берется. Если товаров не меньше 20, то не оплачиваются уже два самых дешевых товара и т.д.
Например, при одновременной покупке \(17\) товаров, покупатель потратит сумму денег равную стоимости только \(16\) самых дорогих из них, а при покупке \(20\) и \(37\) товаров придется заплатить только за \(18\) и \(34\) самых дорогих товара, соответственно.
Миша хочет купить в магазине <<Мир>> \(n\) дисков с альбомами его любимой музыкальной группы. Подобрав подходящие диски, Миша выложил их на ленту в супермаркете в некотором порядке. Так как Миша не только меломан, но и математик, он понял, что ему, возможно, удастся сэкономить, если платить не за все \(n\) товаров одновременно, а разбить их на несколько покупок и оплатить каждую покупку отдельно. Миша решил привлекать к себе как можно меньше внимания и, в частности, не менять порядок товаров на ленте. Таким образом, Миша может только разбивать товары на ленте на группы подряд идущих и платить за каждую группу в отдельности.
Миша, конечно, математик, но вот с арифметикой у него всегда были проблемы. Помогите Мише и скажите, за какую минимальную стоимость он сможет купить \(n\) дисков, разбивая товары на ленте на группы подряд идущих товаров и оплачивая каждую группу отдельно. При этом разные группы могут быть разной длины.
Формат входных данных
В первой строке находится одно число \(n\) (\(1 \leq n \leq 100\,000\)) — количество дисков на ленте.
Следующая строка содержит \(n\) чисел \(a_i\) (\(1 \leq a_i \leq 10^9\)) — стоимости дисков в порядке расположения на ленте.
Формат выходных данных
Выведите наименьшую возможную стоимость покупки всех дисков с учетом акции при оптимальном разбиении дисков на группы.
Примечание
В первом примере Мише в любом случае придется оплатить все диски, так как суммарное количество товаров меньше \(10\).
Во втором тестовом примере оптимально во время первой покупки оплатить первые два диска, а за остальные диски заплатить во время второй покупки. Тогда не придется заплатить за диск стоимостью \(9\).
| |
|
|
Уроки физкультуры
Жадный алгоритм
Сегодня в 5-А классе праздник — урок физкультуры. Традиционно ребята в это время после небольшой разминки играют в футбол. Коля очень любит футбол, но сегодня, проходя мимо учительской, он случайно услышал, что несколько самых сильных школьников из 5-А во время урока физкультуры должны помочь разгружать новые парты. Что же делать? Ведь Коля предпочитает поиграть в футбол!
В голове Коли моментально созрел план. Коля знает, что в 5-А классе N школьников. Он хочет воспользоваться тем, что учитель физкультуры Иван Петрович на уроках вместо обычной расстановки школьников в шеренгу по росту практикует расстановку «по силе». Для этого Иван Петрович сначала расставляет N школьников по росту, а затем (N – 1) раз проходит вдоль шеренги слева направо, каждый раз начиная с самого левого (первого) школьника и заканчивая предпоследним школьником справа. Проходя мимо школьника, который стоит на i-м месте (1 ≤ i ≤ N – 1), Иван Петрович просит его помериться силой с соседом справа, который стоит на (i + 1)-м месте. Если школьник, стоящий левее, оказывается сильнее своего соседа справа, то они меняются местами. Если же силы школьников оказываются равны, либо слева стоит более слабый школьник, то школьники остаются на своих местах. После этого Иван Петрович просит помериться силой школьников, стоящих на местах (i + 1) и (i + 2), и т. д., заканчивая каждый проход школьниками, которые стоят на местах (N – 1) и N. При любом сравнении «по силе» все школьники, включая Колю, показывают свою реальную силу, так как не хотят прослыть слабаками.
Для увеличения шансов поиграть в футбол, Коля хотел бы оказаться как можно левее в получившейся шеренге. Силу каждого из своих одноклассников он знает. По предыдущим занятиям Коля заметил, что если присесть «завязывать шнурки» при каком-либо из проходов учителя, то Иван Петрович во время такого прохода не будет просить Колю мериться силой ни с соседом слева, ни с соседом справа, и, тем более, не будет просить мериться силой соседей Коли, так как они не стоят рядом. Однако, чтобы сохранить силы для игры в футбол, Коля не может присесть более k раз.
Требуется написать программу, которая определит, как нужно действовать Коле, чтобы после проведения расстановки «по силе» оказаться в шеренге как можно левее.
Формат входных данных
В первой строке входных данных задаются три целых числа: N — число школьников в классе, p — место Коли в шеренге по росту, и k — количество приседаний, которое Коля может сделать, не потеряв при этом способность играть в футбол (2 ≤ N ≤ 100 000, 1 ≤ p ≤ N, 1 ≤ k ≤ N – 1).
Во второй строке задаются целые числа a1, a2, ..., aN (1 ≤ ai ≤ 109). Число ai показывает силу школьника, который стоит на i-м месте по росту. Школьник, который стоит на i-м месте в расстановке по росту, сильнее школьника, который стоит j-м месте в расстановке по росту, если ai > aj.
Формат выходных данных
В первой строке выведите самую левую позицию в шеренге, в которой может оказаться Коля после построения школьников «по силе». Во второй строке выведите любую из возможных стратегий Коли, приводящую к этому результату. Стратегия выводится в виде строки из (N – 1) символов, j-й символ этой строки должен быть равен символу «+», если на j-м проходе Коле необходимо присесть, и символу «-» — в противном случае.
| |
|
|
Ударим мостом по бездорожью
Стек
Динамическое программирование: один параметр
Жадный алгоритм
Профиль Уральских гор задается ломаной (x1, y1), (x2, y2), …, (xN, yN), для координат вершин которой верны неравенства x1 < x2 < … < xN. Начальные и конечные точки профиля расположены на уровне моря (y1 = yN = 0).
На горном профиле заданы две различные точки A и B, между которыми требуется проложить дорогу. Эта дорога будет проходить по склонам гор и проектируемому горизонтальному мосту, длина которого не должна превышать L. Оба конца моста находятся на горном профиле. Дорога заходит на мост с одного конца и выходит с другого. Мост не может содержать точек, расположенных строго под ломаной (строительство тоннелей не предполагается).
Возможные примеры расположения моста Невозможное расположение моста

Достоверно известно, что строительство такого моста в данной местности возможно, причем позволит сократить длину дороги из точки A в точку B. Требуется написать программу, которая определит такое расположение горизонтального моста, что длина дороги от точки A до точки B будет наименьшей.
Формат входных данных
Первая строка входных данных содержит два целых числа N и L — количество вершин ломаной (2 ≤ N ≤ 100 000) и максимальную длину моста (1 ≤ L ≤ 106) соответственно. Вторая строка содержит координаты точки A, третья строка — координаты точки B. Точки A и B различны.
Последующие N строк содержат координаты вершин ломаной (x1, y1), (x2, y2), …, (xN, yN). Координаты вершин ломаной, а также точек A и B, задаются парой целых чисел, не превосходящих по абсолютному значению 106. Гарантируется, что x1 < x2 < … < xN и y1 = yN = 0, а также, что точки A и B принадлежат ломаной.
Формат выходных данных
В первой и второй строках выходных данных выведите координаты концов моста с точностью не менее 5 знаков после десятичной точки. В случае, когда решений несколько, выведите любое из них.
| |
|
|
Киноакадемия
Жадный алгоритм
Использование сортировки
В финал конкурса Киноакадемии вышли \(n\) лучших кинофильмов 2014 года. В конкурсе награждаются фильмы в двух номинациях: лучшая режиссура и лучший сценарий. По правилам конкурса в каждой номинации должен быть награжден ровно один фильм, причём в разных номинациях — разные фильмы.
В ходе многочисленных опросов зрителей и кинокритиков удалось собрать данные, показывающие, какой уровень ликования вызовет победа каждого фильма в каждой из номинаций. Дотошные журналисты на этом не остановились и дополнительно выяснили, каким будет уровень ликования, если тот или иной фильм не выиграет ни в одной из номинаций.
Требуется написать программу, которая по результатам опросов определяет наибольший суммарный уровень ликования, которого можно добиться выбором фильмов для награждения в указанных номинациях.
Формат входных данных
В первой строке задано целое число \(n\) — количество кинофильмов, участвующих в финале конкурса Киноакадемии. В следующих \(n\) строках содержатся по три целых числа \(a_i\), \(b_i\), \(c_i\) — уровень ликования, если \(i\)-й фильм не выиграет ни в одной из номинаций, уровень ликования, если этот фильм выиграет в номинации на лучшую режиссуру, и уровень ликования, если этот фильм выиграет в номинации на лучший сценарий.
Формат выходных данных
Первая строка должна содержать одно число — наибольший возможный суммарный уровень ликования. Вторая строка должна содержать два целых числа — номера фильмов-победителей в номинациях лучшая режиссура и лучший сценарий соответственно. Фильмы нумеруются натуральными числами от 1 до \(n\). Если оптимальных способов выбора награждаемых фильмов несколько, можно вывести любой из них.
Пояснение к примеру
В приведенном примере наибольший суммарный уровень ликования равен \(3 + 5 + 9 = 17\).
| |
|
|
Костюмы
Жадный алгоритм
Команда ЛКШ по плаванию состоит из N игроков, известна базовая скорость каждого игрока Vi. В шкафчике находится K магических плавательных костюмов, про которые тренер пустил слух, что они дают бонус к скорости. Костюмы бывают двух типов - спецназовские костюмы с шипами дают процентный бонус, а обычные плавки дают количественный бонус. Мощность воздействия костюма описывается целым числом от 1 до 300. Для спецназовских костюмов оно показывает, на сколько процентов увеличится базовая скорость, а для плавок - на какую величину.
Требуется раздать плавательные костюмы так, чтобы суммарная скорость команды была максимальна. Ясно, что каждый игрок получает не больше одного костюма, если ему не достается костюма, то он идет в шапочке.
Входные данные
В первой строке записано число N (0 <= N <= 400) - число спортсменов, далее N чисел, которые описывают их базовые скорости (целое число от 1 до 10000). Далее записано число K (0 <= K <= 800) - количество костюмов, затем K пар целых чисел, описывающих соответствующую костюмы (тип и мощность). Тип пары описывается либо единичкой (спецназовские костюмы), либо двоечкой (плавки).
Выходные данные
Вывести максимальную суммарную скорость команды с точностью до 4-х знаков.
| |
|
|
Интернет
Жадный алгоритм
Новый интернет-провайдер предоставляет услугу доступа в интернет с посекундной тарификацией. Для подключения нужно купить карточку, позволяющую пользоваться интернетом определенное количество секунд. При этом компания продает карточки стоимостью 1, 2, 4, …, 230 рублей на a0, a1, a2, …, a30 секунд соответственно.
Родители разрешили Пете пользоваться интернетом M секунд Определите, за какую наименьшую сумму он сможет купить карточки, которые позволят ему пользоваться интернетом не менее M секунд. Естественно, что Петя может купить как карточки различного достоинства, так и несколько карточек одного достоинства.
Входные данные
В первой строке содержится единственное натуральное число M (1 ≤ M ≤ 109). Во второй строке задаются натуральные числа a0, a1, …, a30, не превосходящие 109.
Выходные данные
Выведите единственное число – наименьшую сумму денег, которую Пете придется потратить.
| |
|
|
Турнир
Жадный алгоритм
Куча
В турнире по хоккею участвовало K команд, каждая сыграла с каждой по одному матчу. За победу команда получала 2 очка, за ничью – 1, за поражение – 0 очков.
Известно, сколько очков в итоге получила каждая команда, однако результаты конкретных матчей были утеряны. Требуется восстановить одну из возможных турнирных таблиц.
Входные данные
В первой строке входных данных содержится одно натурально число K, не превосходящее 100 – количество команд. Во второй строке задаются через пробел K целых неотрицательных чисел, не превосходящих 2(K–1), – количество очков, набранных командами, занявшими первое, второе, …, K-е места соответственно (то есть каждое следующее число не больше предыдущего).
Выходные данные
Выведите турнирную таблицу в следующем формате. Таблица должна состоять из K строк с результатами игр команд, занявших первое, второе, …, последнее место (команды, набравшие одинаковое число очков, могут быть расположены в таблице в любом порядке). В каждой строке должно быть записано K чисел через пробел – количество очков, набранных в игре данной команды с первой, второй, … командами соответственно. Количество очков – это число 0, 1 или 2. В клетках на главной диагонали (соответствующих не существующей игре команды "самой с собой") нужно записать нули.
Гарантируется, что входные данные соответствуют реальному турниру, то есть хотя бы одна таблица, соответствующая входным данным, может быть построена. Если таких таблиц несколько, выведите любую из них.
| |
|
|
Ключ к успеху
Жадный алгоритм
Организаторы TВ-Шоу “Ключ к успеху” подготовили ряд призов для победителей. Если победитель набрал X очков, он должен выбрать призов в точности на X у.е. От предыдущих шоу у организаторов остались N призов стоимостью a1,a2,... ,an< у.е. соответственно. К сожалению, не известно, сколько именно очков наберет победитель очередной игры. Организаторы решили купить еще M призов, чтобы максимизировать минимальную сумму очков, которую уже нельзя будет набрать имеющимися призами.
Например, если уже имеются призы в 2, 3 и 9 у.е., а покупается 2 приза, то купить надо призы стоимостью 1 и 7 долларов. Тогда победитель сможет набрать себе призы при любом счете от 1 до 22 очков.
Входные данные
В первой строке входных данных находятся два целых числа N и М — число призов у организаторов и число призов, которое они собираются докупить (0 ≤ N ≤ 30, 1 ≤ M ≤ 30). Вторая строка содержит N целых числе в диапазоне от 1 до 109 — стоимости имеющихся призов
Выходные данные
Выведите M чисел — стоимости призов, которые надо купить. Числа следует выводить в порядке неубывания. Если решений несколько — выведите любое из них.
| |
|
|
Мосты
Деревья
Жадный алгоритм
Одна сказочная страна располагалась в дельте далекой реки ( far away river ).
В стране было n островов и на каждом острове находился город. Города были соединены дорогами. Причем существовал в точности один путь от каждого города до любого другого, возможно проходящий через другие города. К сожалению мосты в этой стране были неизвестны, поэтому для пересечения реки использовались понтоны, поэтому путешествия были некомфортными, т.к. приходилось ездить только на лошадях. Когда было открыто мостостроительство король решил вместо нескольких понтонов построить мосты, по которым могли бы ездить даже кареты. В силу бедности страны только k мостов могут быть построены.
Вам необходимо выбрать какие k понтонов надо заменить на мосты так, чтобы суммарное время путешествия между всеми парами городов оказалось минимальным. Вы можете считать, что по обычным дорогам можно ехать только на лошади, а по дороге с мостом — только в карете, запряженной и несколькими лошадьми.
Входные данные
Первая строка входных данных содержит 4 числа n, k, sh и sc — число городов, число мостов, которым можно построить, скорость лошади и скорость экипажа в метрах в секунду (1 ≤ k < n≤ 10 000, 1 ≤sh; sc·≤ 100 000). Каждая из следующих n – 1 строк содержит три целых числа bi, ei — номера соединяемых городов и длину дороги в метрах li (1 ≤ li ≤ 106). Города пронумерованы от 1 до n, дороги пронумерованы от 1 до n – 1.
Выходные данные
k чисел — номера мостов, которые должны быть построены. Если существует несколько оптимальных планов строительства мостов, то выведите любой из них.

| |
|
|
Экзамены
Жадный алгоритм
Двоичное дерево поиска
Теория расписаний
Первая сессия обычно доставляет много проблем. Одна из них заключается в том, что студенту нужен по крайней мере целый день, чтобы подготовиться к одному экзамену. В день одного экзамена к другому готовиться невозможно. Но основная проблема заключается в том, что студенты могут начать готовиться к i-му экзамену, не раньше чем за ti дней до него, иначе они все забудут. Глеб хочет начать готовиться к экзаменам как можно позже, но он собирается все экзамены сдать.
Помогите Глебу выбрать день начала подготовки к экзаменам.
Входные данные
Первая строка выходных данных содержит число экзаменов n (1 ≤ n ≤ 50 000). Следующие строки описывают экзамены. Каждое описание состоит из трех строк. Первая строка – это название экзамена (строка, содержащая только латинские буквы, длиной не более 10). Вторая строка – дата экзамена в формате dd.mm.yyyy. Третья строка содержит величину ti для этого экзамена (1 ≤ ti ≤ 100 000). Все экзамены проходят от 01.01.1900 до 31.12.2100. Не забудьте, что високосными считаются годы, которые делятся на 4 и не делятся на 100 или которые делятся на 400.
Выходные данные
Выведите в формате dd.mm.yyyy, когда Глеб самое позднее сможет приступить к подготовке к экзаменам. Если расписание не позволяет подготовиться к каждому из экзаменов, то выведите слово Impossible.
| |
|
|
Квадрат
Жадный алгоритм
Двумерные массивы
Требуется в каждую клетку квадратной таблицы размером NxN поставить ноль или единицу так, чтобы в любом квадрате размера KxK было ровно S единиц.
Входные данные
Во входных данных записаны три числа — N, K, S (1 ≤ N ≤ 100, 1 ≤ K ≤ N, 0 ≤ S ≤ K2).
Выходные данные
Выведите заполненную таблицу. Числа в строке должны разделяться пробелом, каждая строка таблицы должна быть выведена на отдельной строке файла. Если решений несколько, выведите любое из них.
| |
|
|
Перекошенное разбиение
Жадный алгоритм
Линейные алгоритмы
Дан массив \([a_1, a_2, \ldots, a_n]\), состоящий из неотрицательных целых чисел.
Рассмотрим разбиение массива на \(k\) непустых отрезков подряд идущих элементов. Назовем перекосом разбиения разность между максимальной и минимальной суммой чисел в отрезках разбиения. Требуется найти максимальный перекос разбиения данного массива на \(k\) подотрезков.
Например, если массив равен \([2, 1, 3, 4]\), то у разбиения \([2, 1, 3][4]\) перекос равен \(6-4=2\), у разбиения \([2, 1] [3, 4]\) перекос равен \(7-3=4\), а у разбиения \([2] [1, 3, 4]\) перекос равен \(8-2=6\). Последний вариант является оптимальным среди всех разбиений массива на два непустых отрезка.
Формат входных данных
Первая строка содержит два целых числа \(n\) и \(k\) (\(2 \le k \le n \le 300\,000\)) — длину массива и количество подотрезков, соответственно.
Вторая строка содержит \(n\) целых чисел \(a_i\) (\(0 \le a_i \le 10^9\)) — элементы массива.
Формат выходных данных
Выведите одно число — максимальный перекос разбиения данного массива на \(k\) отрезков.
Примечание
Первый пример разобран в условии задачи.
Во втором примере оптимальным разбиением является \([2][1][3, 4][1]\). Максимальная сумма на подотрезках в данном разбиении равна \(3 + 4 = 7\), минимальная сумма равна \(1\), таким образом, перекос равен \(6\).
| |
|
|
Кластеры роботов
Обход в глубину
Жадный алгоритм
Конструктив
Деревья
На производстве расположены \(n\) роботов, пронумерованных от \(1\) до \(n\). Любая пара роботов может быть либо соединена проводом, либо нет. Всего на производстве \(m\) проводов и \(i\)-й из них сейчас соединяет роботов с номерами \(a_i\) и \(b_i\).
Вы находитесь рядом с роботом номер \(1\). Роботом номер \(t\) можно управлять, если он связан с первым некоторой цепочкой проводов, то есть
-
либо если \(t = 1\);
-
либо если существуют такие \(i_1, \ldots, i_k\), что \(i_1 = 1\), \(i_k = t\), и любые два соседних в этой последовательности робота \(i_j\) и \(i_{j + 1}\) связаны проводом.
Любому из роботов, которыми можно управлять, можно послать команду <<извлеки второй конец подключенного к себе провода и подключи его к другому роботу>>. Иными словами, если роботом номер \(t\) можно управлять, и есть провод, соединяющий его с роботом номер \(x\), то можно заменить провод \((t, x)\) на провод \((t, y)\) для любого \(y \neq t\), еще не связанного проводом с \(t\). Обратите внимание, что после этого вы можете потерять управление над \(t\)-м роботом, если единственная связь \(t\)-го с первым проходила через \(x\)-й.
Ваша задача — получить управление над максимально возможным количеством роботов на производстве. Найдите это количество и самую короткую последовательность действий, приводящую к такому исходу.
Формат входных данных
В первой строке записано целое число \(T\) (\(1 \le T \le 1000\)) — количество наборов входных данных в тесте.
Первая строка каждого набора входных данных содержит целые числа \(n\) и \(m\) (\(1 \leq n \leq 10^5\); \(0 \leq m \leq 1.5 \cdot 10^5\)) — количество роботов и количество проводов, соответственно.
В следующих \(m\) строках дано описание проводов: в \(i\)-й строке даны целые числа \(a_i\) и \(b_i\) (\(1 \leq a_i, b_i \leq n\); \(a_i \neq b_i\)) — номера роботов, соединенных \(i\)-м проводом. Гарантируется, что никакие два провода не соединяют одну и ту же пару роботов.
Также гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\) и сумма \(m\) по всем наборам входных данных не превосходит \(1.5 \cdot 10^5\).
Формат выходных данных
Для каждого набора входных данных выведите в первой строке через пробел максимальное количество роботов, управление над которыми можно получить, и количество действий \(k\), которое для этого понадобится.
В следующих \(k\) строках выведите сами описания действий по одному на каждой строке. Описание действия должно состоять из трех целых чисел \(t\), \(x\) и \(y\) (\(1 \leq t, x, y \leq n\); \(x \neq y\)), означающих, что робот номер \(t\) меняет провод \((t, x)\) на провод \((t, y)\).
Если возможных ответов несколько, выведите любой. Обратите внимание, что \(k\) при этом обязано быть наименьшим, при котором можно подключить максимальное количество роботов.
| |
|
|
Кластеры роботов - 2
Деревья
Жадный алгоритм
Конструктив
Обход в глубину
На производстве расположены \(n\) роботов, пронумерованных от \(1\) до \(n\). Любая пара роботов может быть либо соединена проводом, либо нет. Известно, что \(i\)-й робот соединен с \(k_i\) другими роботами с номерами \(v_{i,1}, \ldots, v_{i,k_i}\). Провода двухсторонние, то есть если \(i\) связан с \(j\), то \(j\) связан с \(i\) (иными словами, \((i, j)\) и \((j, i)\) — это один и тот же провод).
Вы находитесь рядом с роботом номер \(n\). Роботом номер \(t\) можно управлять, если он связан с \(n\)-м некоторой цепочкой проводов, то есть
-
либо если \(t = n\);
-
либо если существуют такие \(i_1, \ldots, i_k\), что \(i_1 = n\), \(i_k = t\), и любые два соседних в этой последовательности робота \(i_j\) и \(i_{j + 1}\) связаны проводом.
Любому из роботов, которыми можно управлять, можно послать команду <<извлеки второй конец подключенного к себе провода и подключи его к другому роботу>>. Иными словами, если роботом номер \(t\) можно управлять, и есть провод, соединяющий его с роботом номер \(x\), то можно заменить провод \((t, x)\) на провод \((t, y)\) для любого \(y \neq t\), еще не связанного проводом с \(t\). Обратите внимание, что после этого вы можете потерять управление над \(t\)-м роботом, если единственная связь \(t\)-го с \(n\)-м проходила через \(x\)-й.
Ваша задача — получить управление над максимально возможным количеством роботов на производстве. Найдите это количество и самую короткую последовательность действий, приводящую к такому исходу.
Формат входных данных
В первой строке записано целое число \(T\) (\(1 \le T \le 1000\)) — количество наборов входных данных в тесте.
Первая строка каждого набора входных данных содержит одно целое число \(n\) (\(1 \leq n \leq 10^5\)) — количество роботов.
Затем следуют \(n\) строк, в \(i\)-й из которых записаны числа \(k_i\) (\(0 \le k_i \le n - 1\)) и \(v_{i,1}, \ldots, v_{i,k_i}\) (\(1 \le v_{i,j} \le n\); \(v_{i,j} \neq i\)) — количество проводов, подключенных к \(i\)-му роботу, и номера роботов на противоположных концах этих проводов. Гарантируется, что данные корректны: никакие два провода не соединяют одну и ту же пару роботов, и если \(j \in v_i\), то \(i \in v_j\).
Также гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\) и сумма количества проводов по всем наборам входных данных не превосходит \(1.5 \cdot 10^5\).
Формат выходных данных
Для каждого набора входных данных выведите в первой строке через пробел максимальное количество роботов, управление над которыми можно получить, и количество действий \(k\), которое для этого понадобится.
В следующих \(k\) строках выведите сами описания действий в формате <<\(y\) + \(t\) - \(x\)>> (\(1 \leq t, x, y \leq n\); \(x \neq y\)). Каждая такая строка соответствует замене провода \((t, x)\) на провод \((t, y)\).
Если возможных ответов несколько, выведите любой. Обратите внимание, что \(k\) при этом обязано быть наименьшим, при котором можно подключить максимальное количество роботов.
| |
|
|
65873
Очередь
Жадный алгоритм
Галактическая станция «Вавилон» имеет N (0 < N <= 10) ангаров для космических кораблей.
Цикл предполетной подготовки длится M (0 < M <= 10) суток. Цикл начинается в тот же момент, как корабль залетает в ангар. До окончания цикла корабль не может покинуть ангар и соответственно начать новый рейс.
Сутки на станции составляют 24 часа. Календарь на станции составляет 365 дней, которые не делятся на месяцы.
Вам попали в руки фрагменты станционного журнала (0 < K <= 1000 строк). В нем фиксируются даты и время прибытия кораблей в зону станции, а также заявки на рейсы со станции. Гарантируется, что все страницы относятся к одному году.
Если корабль подлетает к станции, а все ангары заняты, то ему отказывают в обслуживании. Если вылет со станции назначен на тот же час, что и прилет нового корабля, будем считать, что сначала ангар освобождается, а потом новый корабль размещается в пустом ангаре (начало цикла будет считаться с момента прилета).
Если приходит запрос на рейс со станции, то в рейс уходит тот корабль, который готов к вылету. Если таких кораблей несколько, то выбирается тот, который дольше находится на станции. Если готовых к рейсу кораблей нет, то рейс задерживают и ждут, когда появится корабль, который пройдет цикл предполетной подготовки. Если до конца периода кораблей для выполнения рейса не найдется, то заявка считается НЕ задержанной, а отклоненной.
По данным журнала определите скольким кораблям было отказано и сколько рейсов было отклонено в рассматриваемый период.
Входные данные:
В первой строке через пробел три числа N M K.
Дальше K строк в формате
День Час Признак
Где День – это номер дня от начала года; Час – час события; Признак это 1, если корабль прилетает, -1, если это запрос на вылет.
Выходные данные:
Два целых числа, каждое на новой строке:
– количество отказов в обслуживании;
– количество отклоненных заявок.
Примечание
В журнале 9 записей.
1) 1 9 1
2) 8 12 -1
3) 6 15 -1
4) 6 12 -1
5) 2 18 1
6) 5 6 1
7) 6 12 1
8) 7 12 -1
9) 2 21 1
Корабли, прибывшие 1-го в 9:00 и 2-го в 18:00, были поставлены в два ангара, имеющиеся на станции (1-ая и 5-ая строки журнала).
6-го числа в 12:00 1-ый ангар покинул корабль по заявке из 4-ой строки журнала. В тот же момент его место занял корабль с 7-ой строки.
На момент прилета кораблей из 6-ой и 9-ой строк оба ангара были заняты. Эти корабли получили отказ.
Выполнение заявок с 3-ей и 8-ой строк журнала было задержано, так как не было готовых к вылету кораблей.
Заявка со 2-ой строки была отклонена, так как в ангарах и на подлете в рассматриваемый интервал времени кораблей не было.
| |
|
|
Команда на турнир
Жадный алгоритм
Тренер школьной команды программистов готовится к турниру. В школе всего \(n\) учеников, у каждого есть свой рейтинг \(p_i\) — количество очков, набранных на тренировках.
На турнир нужно отправить ровно \(k\) учеников. Сила команды оценивается как суммарный рейтинг её участников. Тренер хочет, чтобы суммарный рейтинг был максимально возможным.
Помогите тренеру определить, чему равен этот максимальный суммарный рейтинг.
Формат входных данных
В первой строке — два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 2 \cdot 10^5\)) — общее количество учеников и размер команды.
Во второй строке — \(n\) целых чисел \(p_i\) (\(0 \le p_i \le 10^9\)), разделённых пробелами, — рейтинг каждого ученика.
Формат выходных данных
Одно целое число — максимальный суммарный рейтинг команды.
Примечание
В первом примере нужно выбрать трёх учеников из пяти. Лучше всего взять с рейтингами 8, 5 и 3 — в сумме 16.
Во втором примере в команду идут все четверо учеников, поэтому ответ — сумма всех рейтингов.
| |
|
|
Книги на полке
Жадный алгоритм
Библиотекарь расставляет книги на полке длиной \(W\) сантиметров. У него есть \(n\) книг; \(i\)-я книга имеет размеры \(a_i \times b_i\) сантиметров.
Каждую книгу можно поставить на полку двумя способами: одной стороной к соседней книге (тогда она занимает вдоль полки \(a_i\) сантиметров) или другой стороной (тогда \(b_i\) сантиметров). Способ расстановки выбирается для каждой книги независимо.
Библиотекарь хочет поставить на полку максимально возможное количество книг. Какие именно книги — неважно, лишь бы их число было наибольшим. Суммарная ширина расставленных книг не должна превышать длины полки.
Помогите ему определить это максимальное число книг.
Формат входных данных
В первой строке — два целых числа \(n\) и \(W\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le W \le 10^{14}\)) — количество книг и длина полки.
В следующих \(n\) строках — по два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le 10^9\)) — размеры \(i\)-й книги.
Формат выходных данных
Одно целое число — максимальное количество книг, которые можно расставить на полке.
| |
|
|
Доски в кузов грузовика
Жадный алгоритм
На стройплощадку нужно перевезти доски. У бригадира есть грузовик с длинным узким кузовом длиной \(L\) сантиметров — доски укладываются в кузов в один ряд вдоль кузова. На складе лежат \(n\) досок; каждая доска имеет две стороны: толщину \(a_i\) и ширину \(b_i\) сантиметров.
Каждую доску можно положить в кузов двумя способами: плашмя (тогда она занимает вдоль кузова \(a_i\) сантиметров) или на ребро (тогда \(b_i\) сантиметров). Способ укладки выбирается для каждой доски независимо.
Бригадир хочет за один рейс увезти максимальное количество досок. Какие именно — неважно: нужно лишь максимизировать число досок в кузове. Суммарная длина уложенных досок не должна превышать длины кузова.
Определите это максимальное число.
Формат входных данных
В первой строке — два целых числа \(n\) и \(L\) (\(1 \le n \le 2 \cdot 10^5\), \(1 \le L \le 10^{14}\)) — количество досок на складе и длина кузова в сантиметрах.
В следующих \(n\) строках — по два целых числа \(a_i\) и \(b_i\) (\(1 \le a_i, b_i \le 10^9\)) — размеры сторон \(i\)-й доски в сантиметрах.
Формат выходных данных
Одно целое число — максимальное количество досок, которые можно увезти за один рейс.
Примечание
В первом примере выгодно каждую доску укладывать той стороной, которая короче. Тогда доски займут 2, 4, 3 и 1 см — всего 10 см, помещаются все 4.
Во втором примере даже самая тонкая доска толще кузова, ни одну доску положить нельзя.
| |
|
|
Рейтинг участников
Жадный алгоритм
Школьник Тимур участвует в серии онлайн-соревнований по программированию. За весь год проходит \(n\) соревнований, и Тимур заранее знает, сколько очков он может набрать в каждом из них: за \(i\)-е соревнование он получит \(s_i\) очков.
По правилам рейтинга, в итоговую сумму идут только \(k\) соревнований по выбору участника (остальные просто не засчитываются). Тимур хочет выбрать такие \(k\) соревнований, чтобы получить максимальную суммарную сумму очков.
Помогите ему вычислить эту максимальную сумму.
Формат входных данных
В первой строке — два целых числа \(n\) и \(k\) (\(1 \le k \le n \le 10^5\)) — общее количество соревнований и сколько из них идут в зачёт.
Во второй строке — \(n\) целых чисел \(s_i\) (\(0 \le s_i \le 10^9\)), разделённых пробелами, — количество очков за каждое соревнование.
Формат выходных данных
Одно целое число — максимальная суммарная сумма очков за \(k\) выбранных соревнований.
Примечание
В первом примере из пяти соревнований с очками \(1, 5, 3, 8, 2\) надо выбрать три. Лучше всего взять соревнования с очками 8, 5 и 3 — в сумме 16.
Во втором примере в зачёт идут все соревнования, так что ответ — сумма всех очков.
| |
|
|
Сигналы с радиовышки
Жадный алгоритм
Вдоль прямой трассы расположено \(n\) посёлков. У каждого посёлка известна его координата на трассе — целое число \(p_i\). Связисты хотят покрыть все посёлки радиосигналом, установив на трассе несколько радиовышек.
Каждая вышка имеет радиус покрытия 1 километр: она покрывает всё, что находится на расстоянии не более 1 от её координаты. То есть вышка, установленная в точке \(x\), покрывает отрезок \([x - 1; \, x + 1]\). Посёлок считается покрытым, если его координата попадает в покрытие хотя бы одной вышки (граничная точка тоже считается покрытой).
Вышки можно ставить в любых точках прямой, в том числе с нецелыми координатами. Нужно установить минимальное количество вышек, чтобы все посёлки получили сигнал.
Формат входных данных
В первой строке — целое число \(n\) (\(1 \le n \le 10^5\)) — количество посёлков.
Во второй строке — \(n\) целых чисел \(p_i\) (\(-10^9 \le p_i \le 10^9\)), разделённых пробелами, — координаты посёлков. Координаты могут повторяться (несколько посёлков в одной точке).
Формат выходных данных
Одно целое число — минимальное количество радиовышек, необходимое для покрытия всех посёлков.
Примечание
В первом примере посёлки находятся в точках 1, 3, 5. Одна вышка, установленная в точке 2, покроет отрезок \([1; 3]\) и захватит посёлки в точках 1 и 3. Для посёлка в точке 5 нужна ещё одна вышка, например в точке 4 или в точке 5. Итого 2 вышки.
Во втором примере все посёлки близко друг к другу и покрываются одной вышкой.
| |
|
|
Экспедиция на Марс
Жадный алгоритм
Центр управления отправляет на Марс грузовую капсулу. Она может поднять не более \(W\) килограммов полезной нагрузки. Учёные отобрали \(n\) научных приборов, которые хотят отправить в этой миссии; масса каждого прибора равна \(w_i\) килограммов.
Каждый прибор можно либо отправить целиком, либо оставить на Земле — разбирать их на части нельзя. Место в капсуле есть: ограничение только по массе. Цель миссии — отправить максимальное количество разных приборов, чтобы провести как можно больше экспериментов (какие именно приборы полетят — неважно, лишь бы число было максимальным).
Помогите учёным определить, какое максимальное число приборов можно отправить одной капсулой.
Формат входных данных
В первой строке — два целых числа \(n\) и \(W\) (\(1 \le n \le 10^5\), \(1 \le W \le 10^9\)) — количество приборов и грузоподъёмность капсулы в килограммах.
Во второй строке — \(n\) целых чисел \(w_i\) (\(1 \le w_i \le 10^4\)), разделённых пробелами, — масса каждого прибора в килограммах.
Формат выходных данных
Одно целое число — максимальное количество приборов, которые можно отправить на Марс.
Примечание
В первом примере лучше всего отправить приборы массами \(1 + 2 + 3 + 4 = 10\) кг — ровно помещаются в капсулу, итого 4 прибора. Прибор массой 7 кг остаётся на Земле.
Во втором примере каждый прибор по отдельности весит больше грузоподъёмности капсулы. Ни один прибор отправить нельзя.
| |
|
|
Расписание кружков
Жадный алгоритм
В актовом зале школы может проходить только одно мероприятие в каждый момент времени. На проведение актового зала подано \(n\) заявок от разных кружков. Каждая заявка — это интервал времени \([l_i; r_i]\): кружок хочет занять зал с минуты \(l_i\) по минуту \(r_i\) включительно.
Два кружка не могут проходить в зале одновременно: если один занимает время \([l_1; r_1]\), а другой — \([l_2; r_2]\), эти интервалы не должны пересекаться. Если один кружок заканчивается ровно в ту минуту, когда начинается другой, это тоже считается пересечением.
Директор хочет одобрить как можно больше заявок. Какое максимальное количество кружков можно разместить в зале за день?
Формат входных данных
В первой строке — целое число \(n\) (\(1 \le n \le 10^5\)) — количество заявок.
В следующих \(n\) строках — по два целых числа \(l_i\) и \(r_i\) (\(0 \le l_i < r_i \le 10^9\)) — время начала и время окончания каждой заявки.
Формат выходных данных
Одно целое число — максимальное количество заявок, которые можно одобрить.
Примечание
В первом примере можно одобрить заявки \([1; 3]\) и \([4; 7]\) — они не пересекаются.
Во втором примере оптимально взять \([2; 3]\) и \([5; 7]\).
| |
|
|
Классифайд - 1
Жадный алгоритм
Вася открыл собственный классифайд (доску объявлений). Устроен его классифайд следующим образом: для каждого типа товара продавец с номером \(i\) может выставить на продажу только одну единицу товара и заранее указывает минимальную цену \(S_i\), за которую он готов его продать. Каждый покупатель может купить только одну единицу товара, покупатель с номером \(j\) указывает максимальную цену \(B_j\), за которую он готов купить товар. Раз в день Вася собирает все заявки и распределяет покупателей и продавцов, которые заключат сделку и по какой цене. При этом сделка между продавцом \(i\) и покупателем \(j\) может состояться только если \(S_i \le B_j\) по любой цене от \(S_i\) до \(B_j\) (цену назначает Вася).
Вася получает процент с каждой сделки, поэтому он хотел бы максимизировать суммарную стоимость проданных товаров. Помогите Васе определить эту максимальную стоимость.
Формат входных данных
В первой строке задается число наборов тестовых данных \(T\). В этой задаче \(T\) всегда равно 1.
В первой строке описания каждого набора записано число \(N\) (\(1 \le N \le 10\)) — количество продавцов.
В следующей строке записано \(N\) чисел \(S_i\) (\(1 \le S_i \le 100\)).
В следующей строке записано число \(M\) (\(1 \le M \le 10\)).
В следующей строке записано \(M\) чисел \(B_i\) (\(1 \le B_i \le 100\)).
Описания наборов отделяются друг от друга пустой строкой.
Формат выходных данных
Для каждого набора входных данных выведите одно число — максимальную суммарную стоимость проданных товаров.
В этой задаче на проверку необходимо сдать исходный код программы.
| |
|
|
Монотонная подпоследовательность
Жадный алгоритм
Монотонная подпоследовательностьстандартный вводстандартный вывод1 секунда256 мегабайт
Рассмотрим последовательность \(a_1, a_2, \ldots, a_n\). Его подпоследовательность \(a_{i_1}, a_{i_2}, \ldots, a_{i_k}\), где \(1 \le i_1 < i_2 < \ldots < i_k \le n\) назвается монотонной, если либо \[a_{i_1} \le a_{i_2} \le \ldots \le a_{i_k},\] либо \[a_{i_1} \ge a_{i_2} \ge \ldots \ge a_{i_k}.\]
Для заданных \(n\) и \(k\), найдите последовательность, состоящую из чисел от 1 до \(n\) таких, что каждое из чисел встречается в ней ровно один раз, а длина самой длинной монотонной подпоследовательности (возрастающей или убывающей) составляет ровно \(k\).
Формат входных данных
Первая строка входных данных содержит целые числа \(n\) и \(k\) (\(1 \le k \le n \le 10^6\)), длина последовательности и требуемая длина самой длинной монотонной подпоследовательности.
Формат выходных данных
Если требуемой последовательности не существует, выведите \(-1\) в первой и единственной строке.
Если требуемая последовательность существует, выведите ее в первой и единственной строке. Если подходящих последовательностей несколько, можно вывести любую из них.
| |
|
|
Why Did the Cow Cross the Road
Жадный алгоритм
Коровы Фермера Джона учатся переходить через дорогу эффективно.
И ищут цыплят в качестве учителей.
Цыплята очень занятые существа и имеют ограниченное время для помощи коровам.
Всего имеется \(C\) цыплят на ферме (\(1 \leq C \leq 20,000\)), последовательно
пронумерованных \(1 \ldots C\), и каждый цыплёнок \(i\) может помогать коровам
ровно время \(T_i\). Коровы никуда не торопятся. Всего имеется \(N\) коров на ферме
(\(1 \leq N \leq 20,000\)), последовательно пронумерованных \(1 \ldots N\), и корова
\(j\) способно переходить дорогу между временами \(A_j\) и \(B_j\). В идеале корова
\(j\) хочет найти цыплёнка \(i\), который поможет её перейти через дорогу. Для того,
чтобы их расписания были совместимы, необходимо чтобы выполнялось неравенство
\(A_j \leq T_i \leq B_j\).
Если для каждой коровы может быть взят в пару не более чем один цыплёнок
и каждый цыплёнок может быть взят в пару не более чем с одной коровой, помогите
найти максимальное количество пар корова-цыплёнок, которого можно достичь.
ФОРМАТ ВВОДА (файл helpcross.in):
Первая строка ввода содержит \(C\) и \(N\). Следующие \(C\) строк содержат \(T_1 \ldots T_C\),
а последующие \(N\) строк содержат \(A_j\) и \(B_j\) (\(A_j \leq B_j\)) для \(j = 1 \ldots N\).
\(A\), \(B\), \(T\)' – все неотрицательные числа (не обязательно различные) не более
1,000,000,000.
ФОРМАТ ВВОДА (файл helpcross.out):
Вычислите максимально-возможное количество пар корова-цыплёнок.
| |
|
|
Why Did the Cow Cross the Road III
Жадный алгоритм
Использование сортировки
Задачи на моделирование
Фермер Джон на старости лет стал параноиком. Он построил огромную
изгородь вокруг фермы для защиты своих коров. Коровам такая идея не понравилась.
Соседние коровы ещё имеют возможность войти, но только через одни ворота
и с большой очередью, потому что каждой нужно ответить на длинный список вопросов,
прежде чем войти.
Для каждой из \(N\) коров, посещающих ферму, вам сообщается время, когда она
прибывает к воротам и количество времени, которое её требуется для ответов на
вопросы. В каждый момент времени только одна корова опрашивается, поэтому,
если много коров прибывает примерно в одно и то же время, они должны ждать
своей очереди отвечать на вопросы. Например, если корова прибыла во время 5
и отвечает на вопросы 7 единиц времени, то другая корова, прибывшая во время 8
должна подождать до времени 12, что начать отвечать на вопросы.
Определите минимально возможное время, за которое все коровы войдут на ферму.
ФОРМАТ ВВОДА (файл cowqueue.in):
Первая строка ввода содержит \(N\), положительное целое число, не более 100.
Каждая из последующих \(N\) строк описывает одну корову, задавая время прибытия
и время, которое требуется ей для ответов на вопросы. Каждое из этих чисел
- положительное целое число не более 1,000,000.
ФОРМАТ ВЫВОДА (файл cowqueue.out):
Определите минимально возможное время, в которое все коровы завершат обработку.
| |
|
|
Circular Barn
Жадный алгоритм
Будучи фанатом современной архитектуры, Фермер Джон построил новый амбар в форме круга. Внутри амбар составляет кольцо из \(n\) комнат, пронумерованных по часовой стрелке \(1 \ldots n\) по периметру (\(3 \leq n \leq 1,000\)). Каждая комната имеет двери в две соседние комнаты, а также дверь из амбара во внешний мир.
У ФД есть ровно \(n\) коров, и он хочет поместить по одной корове в каждую комнату.
Однако своенравные коровы выстроились не как нужно, и возможно несколько коров собрались у одной внешней двери. А именно, \(c_i\) коров стоит перед дверью с номером \(i\). Разумеется, \(\сумма c_i = n\).
Чтобы коровы добрались до своих мест ФД собирается применить следующий подход: каждая корова входит в дверь, перед которой она стоит и идёт по часовой стрелке в свою комнату. В предположении, что проход коровы через \(d\) дверей отнимает у неё \(d^2\) энергии, определите минимальное количество энергии, которое требуется, чтобы распределить коров по одной в комнату.
ФОРМАТ ВВОДА (файл cbarn.in):
Первая строка ввода содержит \(n\). Оставшиеся \(n\) строк содержат \(c_1 \ldots c_n\).
ФОРМАТ ВЫВОДА (файл cbarn.out):
Выведите минимальное количество энергии, потреблённое всеми коровами.
| |
|
|
Circular Barn
Жадный алгоритм
Префиксные суммы(минимумы, ...)
Будучи фанатом современной архитектуры, Фермер Джон построил новый амбар в форме круга. Внутри амбар составляет кольцо из \(n\) комнат, пронумерованных по часовой стрелке \(1 \ldots n\) по периметру (\(3 \leq n \leq 100,000\)). Каждая комната имеет двери в две соседние комнаты, а также дверь из амбара во внешний мир.
У ФД есть ровно \(n\) коров, и он хочет поместить по одной корове в каждую комнату.
Однако своенравные коровы выстроились не как нужно, и возможно несколько коров собрались у одной внешней двери. А именно, \(c_i\) коров стоит перед дверью с номером \(i\). Разумеется, \(\сумма c_i = n\).
Чтобы коровы добрались до своих мест ФД собирается применить следующий подход: каждая корова входит в дверь, перед которой она стоит и идёт по часовой стрелке в свою комнату. В предположении, что проход коровы через \(d\) дверей отнимает у неё \(d^2\) энергии, определите минимальное количество энергии, которое требуется, чтобы распределить коров по одной в комнату.
ФОРМАТ ВВОДА (файл cbarn.in):
Первая строка ввода содержит \(n\). Оставшиеся \(n\) строк содержат \(c_1 \ldots c_n\).
ФОРМАТ ВЫВОДА (файл cbarn.out):
Выведите минимальное количество энергии, потреблённое всеми коровами.
| |
|
|
Milk Pails
Жадный алгоритм
Фермер Джон получил заказ доставить ровно \(M\) единиц молока (\(1 \leq M \leq 1,000\)).
К несчастью, его молочная машина сломалась и у него есть три бидона молока целых размеров
\(X\), \(Y\), and \(M\) (\(1 \leq X < Y < M\)). Все три бидона изначально пустые. Используя эти три бидона, он может выполнять любое количество операций двух следующих типов:
- Он может заполнить самый маленький бидон (размера \(X\)) полностью до самого верха \(X\) единицами молока, и перелить всё молоко в бидон размера \(M\), если не переполнится бидон с размером \(M\)
- Он может заполнить средний бидон (размера \(Y\)) полностью до верха \(Y\) единицами молока и перелить всё молоко в бидон размера \(M\), если не переполнится бидон с размером \(M\)
ФД понимает, что он не всегда может полностью заполнить бидон с размером \(M\), помогите ему определить максимальное количество молока, которое он может залить в бидон с размером \(M\)
ФОРМАТ ВВОДА (файл pails.in):
Первая и единственная строка ввода содержит \(X\), \(Y\) и \(M\), разделённые одиночными пробелами.
ФОРМАТ ВЫВОДА (файл pails.out):
Выведите максимальное количество молока, которое ФД может залить в бидон размером \(M\).
| |
|
|
Cow Dance Show
Бинарный поиск по ответу
Очередь
Жадный алгоритм
После нескольких месяцев репетиций, коровы готовы дать ежегодное танцевальное
представление - балет "Cowpelia".
Остался непрояснённым только размер сцены. Сцена размера \(K\) может выдержать
\(K\) коров, танцующих одновременно. \(N\) коров в стаде (\(1 \leq N \leq 10,000\))
пронумерованы последовательно \(1 \ldots N\) в порядке, в котором они должны появиться
на сцене во время танца. Каждая корова \(i\) планирует танцевать определённое время
\(d(i)\). Изначально коровы \(1 \ldots K\) появляются на сцене и начинают танцевать.
Когда первая из этих коров завершит свой танец, она покидает сцену и корова \(K+1\)
немедленно начинает танцевать и т.д. Поэтому всегда \(K\) коров танцуют, за исключением
последнего отрезка шоу, когда коровы уходят, но не добавляются. Шоу завершается,
когда последняя корова завершит свой танец в момент времени \(T\).
Понятно, что чем больше значение \(K\), тем меньше время \(T\). Поскольку шоу не может
длится очень долго, вам на вводе даётся верхняя граница \(T_{max}\), указывающая
максимально возможное значение величины \(T\). Ваша задача - определить минимально
возможное подходящее значение \(K\).
ФОРМАТ ВВОДА (файл cowdance.in):
Первая строка ввода содержит \(N\) и \(T_{max}\), где \(T_{max}\) - целое число, не более
1 000 000.
Следующие \(N\) строк задают длительности танцев \(d(1) \ldots d(N)\) для коров
\(1 \ldots N\). Каждое из \(d(i)\) - целое число в интервале \(1 \ldots 100,000\).
Гарантируется, что если \(K=N\), шоу закончится вовремя.
ФОРМАТ ВЫВОДА (файл cowdance.out):
Выведите наименьшее возможное значение \(K\) такое, что танцевальное шоу
закончится не более чем через \(T_{max}\) единиц времени.
| |
|
|
Angry Cows
Бинарный поиск по ответу
Жадный алгоритм
Задачи на моделирование
Беси создала новую игру.
Игрок стреляет коровами на одномерную сцену, состоящую из множества стогов сена
расположенных в различных точках на числовой прямой. Каждая корова приземляется
с силой достаточной, чтобы разрушить ближайшие к точке приземления стоги.
Цель - использовать множество коров так, чтобы разрушить все стоги сена.
Имеется \(N\) стогов сена расположенных в целочисленных позициях
\(x_1, x_2, \ldots, x_N\) на числовой прямой. Если корова приземляется с энергией \(R\)
в позиции \(x\), это вызывает взрыв "радиуса \(R\)", разрушающий все стоги
сена в диапазоне \(x-R \ldots x+R\).
Всего имеется \(K\) коров для выстрелов, каждая с одной и той же энергией \(R\).
Определите минимальную целую величину \(R\) такую, что возможно используя эти \(K\)
коров разрушить все стоги сена на сцене.
ФОРМАТ ВВОДА (файл angry.in):
Первая строка ввода содержит \(N\) (\(1 \leq N \leq 50,000\)) и \(K\)
(\(1 \leq K \leq 10\)). Каждая из оставшихся \(N\) строк содержит целые числа
\(x_1 \ldots x_N\) (каждое в интервале \(0 \ldots 1,000,000,000\)).
ФОРМАТ ВЫВОДА (файл angry.out):
Выведите минимальную энергию \(R\), с которой должна приземлиться каждая корова,
для того чтобы разрушить все стоги сена.
| |
|
|
High Card Wins
Жадный алгоритм
Использование сортировки
Корова Беси - фанат карточных игр. Однако у неё нет достойных противников.
Все они играют в полностью предсказуемой манере. Однако надо ещё придумать,
как выиграть у них.
Беси и Эльза играют в простую карточную игру, в которой имеется колода
из \(2N\) карт, последовательно пронумерованных \(1 \ldots 2N\). Они делят её
поровну - \(N\) карт Беси и \(N\) карт Эльзе. Затем они играют \(N\) раундов,
в каждом из которых Беси и Эльза выкладывают по одной карте, и тот, у кого
карта больше, зарабатывает очко.
Беси может предсказать порядок, в котором будет выкладывать карты Эльза.
Определите максимальное количество очков, которое может выиграть Беси.
ФОРМАТ ВВОДА (файл highcard.in):
Первая строка ввода содержит значение N (\(1 \leq N \leq 50,000\)).
Следующие N строк содержат карты, которыми будет играть в каждом
из последующих раундов игры. Заметим, что из этой информации легко
определить карты, которые на руках у Беси.
ФОРМАТ ВЫВОДА (файл highcard.out):
Выведите в одной строке максимальное количество очков, которое может
заработать Беси.
| |
|
|
High Card Wins
Жадный алгоритм
Использование сортировки
Задачи на моделирование
Корова Беси - фанат карточных игр. Однако у неё нет достойных противников.
Все они играют в полностью предсказуемой манере. Однако надо ещё придумать,
как выиграть у них.
Беси и Эльза играют в простую карточную игру, в которой имеется колода
из \(2N\) карт, последовательно пронумерованных \(1 \ldots 2N\). Они делят её
поровну - \(N\) карт Беси и \(N\) карт Эльзе. Затем они играют \(N\) раундов,
в каждом из которых Беси и Эльза выкладывают по одной карте, и тот, у кого
карта больше, зарабатывает очко.
Беси может предсказать порядок, в котором будет выкладывать карты Эльза.
Определите максимальное количество очков, которое может выиграть Беси.
ФОРМАТ ВВОДА (файл highcard.in):
Первая строка ввода содержит значение N (\(1 \leq N \leq 50,000\)).
Следующие N строк содержат карты, которыми будет играть в каждом
из последующих раундов игры. Заметим, что из этой информации легко
определить карты, которые на руках у Беси.
ФОРМАТ ВЫВОДА (файл highcard.out):
Выведите в одной строке максимальное количество очков, которое может
заработать Беси.
| |
|
|
High Card Low Card (Platinum)
Жадный алгоритм
Использование сортировки
Беси и Эльза играютв простую карточную игру. Берётся колода из \(2N\) карт,
последовательно пронумерованных \(1 \ldots 2N\), и делится на две части по
\(N\) карт для Беси и \(N\) карт для Эльзы. Затем они играют \(N\) раундов,
в каждом из которых Беси и Эльза выкладывают по одной карте. Изначально,
одно очко за каждый раунд выигрывает игрок, у которого карта больше.
Однако однажды за всю игру Беси может переключить правила игры так, что
до конца игры выигрывать одно очко за раунд будет игрок, карта которого
меньше. Беси может также выбрать не использовать эту опцию, оставляя на всю игру правило "выигрывает бОльшая карта" или она может включить это правило перед первыми раундом, и тогда вся игра ведётся по правилу "выигрывает меньшая карта".
Зная порядок, в котором будет выкладывать свои карты Эльза, помогите Беси
определить максимальное количество очков, которое она сможет заработать.
ФОРМАТ ВВОДА (файл cardgame.in):
Первая строка ввода содержит значение N ( \(2 \leq N \leq 50,000\)).
Следующие N строк содержат карты которым играет Эльзав том порядке как
она их будет выкладывать в последовательных раундах игры. Заметим, что по
этой информации легко определить, какие карты на руках у Беси.
ФОРМАТ ВЫВОДА (файл cardgame.out):
Выведите одну строку, содержащую максимальное количество очков, которое
может заработать Беси.
| |
|
|
High Card Low Card (Gold)
Жадный алгоритм
Беси и Эльза играют в простую карточную игру. Берётся колода из \(2N\) карт,
последовательно пронумерованных \(1 \ldots 2N\), и делят их поровну - \(N\) карт
Беси и \(N\) карт Эльзе. Затем они играют \(N\) раундов, в каждом из которых
Беси и Эльза выкладывают по одной карте. В первых \(N/2\) раундах очко
зарабатывает тот игрок, у которого карта больше. А в последних \(N/2\) раундах
очко выигрывает тот игрок, у которого карта меньше.
По известному порядку выкладывания карт Эльзой определите
максимальное количество очков, которое может заработать Беси.
ФОРМАТ ВВОДА (файл cardgame.in):
Первая строка ввода содержит значение N ( \(2 \leq N \leq 50,000\); \(N\) чётное).
Следующие N строк содержат карты, которыми будет играть Эльза в
каждом из последующих раундов игры. Заметим, что по этой информации,
легко определить карты Беси.
ФОРМАТ ВЫВОДА (файл cardgame.out):
Выведите одну строку дающую максимальное количество очков, которое
может заработать Беси.
| |
|
|
High Card Low Card (Gold)
Жадный алгоритм
Беси и Эльза играют в простую карточную игру. Берётся колода из \(2N\) карт,
последовательно пронумерованных \(1 \ldots 2N\), и делят их поровну - \(N\) карт
Беси и \(N\) карт Эльзе. Затем они играют \(N\) раундов, в каждом из которых
Беси и Эльза выкладывают по одной карте. В первых \(N/2\) раундах очко
зарабатывает тот игрок, у которого карта больше. А в последних \(N/2\) раундах
очко выигрывает тот игрок, у которого карта меньше.
По известному порядку выкладывания карт Эльзой определите
максимальное количество очков, которое может заработать Беси.
ФОРМАТ ВВОДА (файл cardgame.in):
Первая строка ввода содержит значение N ( \(2 \leq N \leq 50,000\); \(N\) чётное).
Следующие N строк содержат карты, которыми будет играть Эльза в
каждом из последующих раундов игры. Заметим, что по этой информации,
легко определить карты Беси.
ФОРМАТ ВЫВОДА (файл cardgame.out):
Выведите одну строку дающую максимальное количество очков, которое
может заработать Беси.
| |
|
|
Cow Jog
Жадный алгоритм
N (1 <= N <= 100,000) коров бегут по одной бесконечно длинной дорожке. Все коровы начинают в различных позициях и некоторые коровы бегут с разной скоростью. Коровы не могут перепрыгивать друг друга. Когда болеебыстрая корова догоняет более медленную, она замедляет свою скорость и становится часть, некоторой группы коров бегущих с одной скоростью. Забег длится T минут (1 <= T <= 1,000,000,000). Определите, сколько групп образуется к концу забега. Две коровы рассматриваются принадлежащими к одной группе, если они окажутся в одной позиции в конце T минут. Формат входных данных Первая строка ввода содержит два целых числа N и T. Каждая из следующих N строк содержит начальную позицию и скорость одной коровы. Позиция - неотрицательное целое число, а скорость - положительное целое число. Оба числа не превысят 1 миллиард. Все коровы начинают в различных позициях, заданных на вводе в порядке возрастания. Формат выходных данных Одно целое число, указывающее сколько групп останется после T минут.
| |
|
|
Cow Jog
Жадный алгоритм
N (1 <= N <= 100,000) коров фермера Джона бегут по бесконечной трассе. Все коровы начинают в различных позициях и некоторые коровы бегут с различной скоростью. Трасса поделена на дорожки, поэтому коровы могут обгонять друг друга. Никакие две коровы на одной и той же дорожке не могут занимать одну и ту же позицию. Фермер Джон хочет, чтобы никакая корова не меняла свою дорожку или изменяла свою скорость. И он интересуется, сколько дорожек ему нужно, если коровы будут бежать T минут (1 <= T <= 1,000,000,000). Формат входных данных Первая строка ввода содержит N и T. Каждая из последующих N строк содержит начальную позицию и скорость одной коровы. Позиция - это неотрицательное целое число, а скорость - положительное целое число, оба не более 1 миллиарда. Все коровы начинают в различных позициях, заданных в порядке возрастания на вводе. Формат выходных данных Одно целое число, указывающее минимальное количество дорожек, необходимое, чтобы никакие две коровы не занимали на одной и той же дорожке одну и ту же позицию в течение времени T (включительно).
| |
|
|
Cow Jog
Жадный алгоритм
Имеется N коров, бегающих вдоль бесконечно-длинной прямой трассы. (1 <= N <= 100,000). Каждая корова начинает с уникальной позиции и некоторые коровы бегут с различной скоростью. Трасса имеет только одну дорожку и корова не может перепрыгнуть другую. Поэтому, когда более быстрая корова настигает более медленную, она замедляет свою скорость и становится частью некоторой бегущей группы коров. Фермер Джон хочет, чтобы ВЫ посчитали, сколько таких групп образуется. Формат входных данных Первая строк ввода содержит целое число N. Каждая из последующих строк содержит начальную позицию и скорость одной коровы. Позиция - это неотрицательное целое число, а скорость - положительное целое число, оба числа не более 1,000,000,000. Все коровы начинают в различных позициях, которые задаются в порядке возрастания на вводе. Формат выходных данных Одно целое число, указывающее, сколько групп останется.
| |
|
|
Compatible Pairs
Жадный алгоритм
Фермер Джон заметил, что имеется \(N\) (\(1\le N\le 2\cdot 10^5\)) уникальных
ID-номеров и для каждого уникального ID \(d_i\) (\(0\le d_i\le 10^9\)),
имеется \(n_i\) (\(1\le n_i\le 10^9\)) коров с таким ID.
Эти коровы могут коммуницировать в парах, их секретный метод шифрования
имеет одно строгое правило: две коровы могут обмениваться информацией
если это не одна и та же корова и сумма их ID-номеров равна или \(A\) или \(B\)
(\(0\le A\le B\le 2\cdot 10^9\)). В один момент времени, корова может быть вовлечена только в одну беседу (то есть никакая корова не может быть частью более чем одной пары)
ФД хочет максимизировать количество коммуницирующих пар.
Определите максимальное количество бесед, которые могут состоятся в один момент времени.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\), \(A\), \(B\).
Каждая из последующих \(N\) строк содержит \(n_i\) и \(d_i\).
Никакие два \(d_i\) не совпадают.
ФОРМАТ ВЫВОДА (на экран / stdout):
Максимальное количество несвязных коммуницирующих пар которые могут быть сформированы
в один и тот же момент времени.
В задаче может потребоваться использование 64-битного целого типа данных
(например, "long long" в C/C++).
| |
|
|
Lazy Sort
Жадный алгоритм
дп
У Фермера Джона есть \(N\) коров (\(2 \leq N \leq 5\cdot 10^6\)) и пытается заставить
их отсортировать неотрицательный целочисленный массив \(A\) длины \(N\), полагаясь на их
лень. У него много тяжелых коробок, поэтому он выстраивает коров одну за другой,
где корова \(i+1\) находится за коровой \(i\), и дает \(a_i\) коробок корове \(i\)
(\(0\le a_i\)).
Коровы по своей природе ленивы, поэтому они всегда ищут способ передать свою работу
кому-то другому. От коровы \(1\) до \(N-1\) по порядку каждая корова смотрит на корову позади себя.
Если у коровы \(i\) строго больше коробок, чем у коровы \(i+1\), корова \(i\) считает, что это
«несправедливо» и отдает одну из своих коробок корове \(i+1\). Этот процесс повторяется,
пока каждая корова не будет удовлетворена.
Фермер Джон пометил количество ящиков \(b_i\), которое каждая корова \(i\)
держит и создал массив \(B\) из этих величин. Если \(B = sorted(A)\) тогда
ФД счастлив. К несчастью. ФД забыл все кроме \(Q\) величин массива \(A\).
(\(2 \leq Q \leq \min(N, 100)\)). К счастью, эти величины включают количество ящиков,
которое он собирается дать первой и последней корове. Каждое число, которое помнит ФД
задано в виде \(c_i \; v_i\), представляющее, что \(a_{c_i}=v_i\).
(\(1 \leq c_i \leq N\), \(1\le v_i\le 10^9\)). Определите количество различных способов,
которыми могут быть заполнены пропущенные величины так чтобы ФД был счастливым.
ответ выводите по модулю \(10^9+7\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит два разделённых пробелом целых числа \(N\) и \(Q\)
представляющие количество коров и запросов соответственно.
Следующие \(Q\) строк содержат два разделённых пробелом целых числа \(c_i \; v_i\)
представляющих что корова \(c_i\) изначально держит \(v_i\) ящиков. Гарантируется, что
\(c_1 = 1\), \(c_Q = N\), и \(c_i < c_{i+1}\) (порядок коров строго возрастающий).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите количество способов по модулю \(10^9+7\), которыми могут быть назначены
значения \(a_i\), так, что ФД будет счастлив после того, как коровы выполнят
ленивую сортировку. Гарантируется существование как минимум одного такого
назначения.
| |
|
|
OohMoo Milk
Жадный алгоритм
У Фермера Джона есть \(N\) \((1 \leq N \leq 10^5)\) бутылок, которые он хочет
наполнить молоком. Каждая бутылка изначально содержит некоторое количество
молока \(m_i\) \((0 \leq m_i \leq 10^9)\). Каждый день он берёт \(A\) \((1 \le A \le N)\)
бутылок и наполняет одной единицей молока.
К несчастью, Фермер Нхой, соперник ФД по бизнесу, знает об этом процессе ФД и
намерен навредить. Каждый день после того, как ФД заполнит свои \(A\) бутылок,
ФН незаметно крадёт одну единицу молока из \(B\) \((0 \le B < A)\) различных
непустых бутылок. Чтобы оставаться незамеченным, ФН выбирает \(B\) так, чтобы
оно было строго меньше чем \(A\).
После \(D\) (\(1 \leq D \leq 10^9\)) дней ФД продаёт своё молоко. Если в бутылке
\(M\) единиц молока, он продаёт эту бутылку за \(M^2\) денежных единиц.
Пусть \(P\) - уникальная прибыль, такая, что FJ может гарантировать, что он получит не менее
\(P\) прибыли независимо от того, как ведет себя FN, а FN может гарантировать, что FJ получит не более
\(P\) прибыли независимо от того, как ведет себя FJ. Выведите значение \(P\) по модулю
\(10^9+7\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\) и \(D\), где \(N\) это количество бутылок, а \(D\) - количество
дней.
Вторая строка содержит \(A\) и \(B\) количество единиц молока, которое ФД добавляет,
а ФН вычитает соответственно.
Третья строка содержит \(N\) разделённых пробелами целых чисел \(m_i\),
представляющих изначальное количество молока в бутылках.
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите значение \(P\) по модулю \(10^9+7\).
| |
|
|
More Cow Photos
Жадный алгоритм
Фермер Джон выстроил коров в ряд и хочет их сфотографировать.
Каждая из \(N\) коров \((1 \le N \le 10^5)\) имеет целую высоту от \(1\) до \(N\).
ФД хочет сфотографировать их в определённом порядке.
Если коровы с высотами \(h_1, \dots, h_K\) стоят в ряд слева направо,
он хочет, чтобы для их высот выполнялись следующие три свойства:
- Чтобы высоты коров сначала возрастали, а потом убывали.
Формально, должно существовать такое целое число \(i\), что
\(h_1 \le \dots \le h_i \ge \dots \ge h_K\).
- Чтобы рядом стояли коровы с одинаковой высотой.
Формально, \(h_i \neq h_{i+1}\) для \(1 \le i < K\).
- Чтобы фотография была симметричной.
Формально, если \(i + j = K+1\), then \(h_i = h_j\).
ФД хочет, чтобы на фотографии было как можно больше коров.
А именно, ФД может удалить некоторых коров и переупорядочить оставшихся коров.
Вычислите максимальное количество коров, которые ФД может выставить
на своей фотографии, удовлетворив указанные свойства.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Имеется множество подтестов.
Первая строка ввода содержит одно целое число \(T\) (\(1 \leq T \leq 10^5\)),
обозначающее количество подтестов. Далее следуют \(T\) подтестов.
Первая строка каждого подтеста содержит одно целое число \(N\). Вторая строка
каждого подтеста содержит \(N\) целых чисел, высоты имеющихся \(N\) коров.
Эти числа в интервале от \(1\) до \(N\).
Гарантируется, что сумма \(N\) по всем подтестам не превысит \(10^6\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите \(T\) строк, \(i\)-ая строка содержит ответ на \(i\)-ый подтест -
целое число, обозначающее максимальное количество коров, которых ФД
может включить в фотографию.
| |
|
|
Watering the Plants
Жадный алгоритм
Сад Беси имеет \(N\) растений, помеченных от \(1\) до \(N\)
(\(2\leq N\leq 5\cdot 10^5\)) слева направо. Беси знает, что растение
\(i\) требует не менее \(w_i\) (\(0\leq w_i \leq 10^6\)) единиц воды.
У Беси своеобразная ирригационная система с \(N-1\) каналами,
пронумерованными от \(1\) до \(N-1\). Каждый канал \(i\) имеет ассоциированную с ним
стоимость \(c_i\) (\(1\le c_i\le 10^6\)), такую что Беси может заплатить
\(c_i*k\) чтобы обеспечить растение \(i\) и \(i+1\) каждое \(k\) единицами воды
где \(k\) неотрицательное целое число.
Беси сильно занята и может не иметь времени использовать все каналы.
Для каждого \(2\leq i \leq N\) вычислите минимальную стоимость требуемую,
чтобы доставить воду растениям от \(1\) до \(i\) используя только первые \(i-1\) каналов.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит положительное целое число \(N\).
Вторая строка содержит \(N\) разделённых одиночными пробелами целых чисел
\(w_1, \ldots, w_N\).
Тртья строка содержит \(N-1\) разделённых одиночными пробелами целых чисел
\(c_1, \ldots, c_{N-1}\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите \(N-1\) целых чисел, каждое в отдельной строке. \((i-1)\)-ое целое число должно
представлять минимальную стоимость доставить воду к первым \(i\) растениям, используя
первые \(i-1\) каналов.
| |
|
|
The Best Lineup
Жадный алгоритм
Фермер Джон выстроил \(N\) \((1 \leq N \leq 2 \cdot 10^5)\) своих коров в ряд \(a\).
\(i\)'-ая корова от начала ряда \(a\) помечена целым числом \(a_i\)
(\(1 \leq a_i \leq N\)). Несколько коров могут быть помечены одним и тем же числом.
ФД конструирует ряд \(b\) следующим образом:
- Изначально массив \(b\) пустой.
- Пока массив \(a\) не пустой, удалить первый элемент ряда \(a\) и добавить или не добавить этот элемент в конец массива \(b\).
ФД хочет сконструировать \(b\) так, чтобы последовательность меток в \(b\) от начала
к концу была лексикографически наибольшей.
Прежде чем ФД начнёт конструировать ряд \(b\), он может выполнить следующую
операцию не более чем один раз.
- Выбрать корову в ряду \(a\) и переместить её в любую позицию, кроме текущей.
При условии, что ФД оптимально выполняет эту операцию не более одного раза,
выведите лексикографически наибольшую последовательность \(b\), которую он сможет получить.
Каждый тест состоит из \(T\) (\(1 \leq T \leq 100\)) независимых подтестов.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка ввода содержит \(T\).
Первая строка каждого подтеста содержит \(N\).
Вторая строка каждого подтеста содержит \(N\) разделённых одиночными
пробелами целых чисел \(a_1, a_2, \ldots, a_N\).
Гарантируется что сумма \(N\) по всем подтестам не превысит \(10^6\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого подтеста выведите лексикографически наибольший \(b\).
| |
|
|
True or False Test
Жадный алгоритм
жадные алгоритмы
реализация
**Замечание: Время на тест для этой задачи 3сек, в 1.5 большее чем по умолчанию.
Память на тест для этой задачи 512MB, в два раза больше чем по умолчанию.**
Беси проходит тест вида да/нет из \(N\) вопросов (\(1\le N\le 2\cdot 10^5\)).
За \(i\)-ый вопрос она может добавить \(a_i\) баллов если ответит правильно,
и отнять \(b_i\) баллов, если ответит неправильно или не изменить сумму, если
не ответит вообще на вопрос (\(0<a_i,b_i\le 10^9\)).
Беси знает ответы на все вопросы, но боится, что администратор теста Эльза
подменит до \(k\) вопросов так, чтоб получилось, что Беси ответила неправильно.
Заданы \(Q\) (\(1\le Q\le N+1\)) кандидатов величин \(k\) (\(0\le k\le N\)),
определите количество баллов, которые Беси гарантированы для каждого \(k\),
зная, что она должна ответить не менее чем на \(k\) вопросов.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\) и \(Q\).
Каждая из следующих \(N\) строк содержит \(a_i\) и \(b_i\).
Каждая из следующих \(Q\) строк содержит значение \(k\).
Ни одно из значений \(k\) не появится более одного раза.
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите ответ для каждого \(k\) на отдельной строке.
| |
|
|
Making Mexes
Жадный алгоритм
Вам дан массив \(a\) из \(N\) неотрицательных чисел \(a_1, a_2, \dots, a_N\)
(\(1\le N\le 2\cdot 10^5, 0\le a_i\le N\)). За одну операцию Вы можете изменить
любой элемент \(a\) на любое неотрицательное число.
mex массива это минимальное неотрицательное число, которого нет в массиве.
Для каждого \(i\) в интервале от \(0\) до \(N\) включительно, вычислите минимальное
количество операций, которое Вы должны сделать, чтобы сделать mex массива \(a\) равным \(i\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\).
Следующая строка содержит \(a_1,a_2,\dots, a_N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого \(i\) в интервале от \(0\) до \(N\), выведите минимальное количество операций
для \(i\) в новой строке. Заметим, что всегда возможно сделать mex массива \(a\)
равным любому \(i\) в интервале от \(0\) до \(N\).
| |
|
|
Bessie's Interview
Жадный алгоритм
Беси ищет новую работу. К счастью сейчас \(K\) фермеров проводят интервью
для найма работников. Поскольку желающих найти работу много, фермеры
решили перенумеровать коров и интервьюировать их в порядке нумерации.
\(N\) коров подали заявки на интервью, поэтому у Беси номер \(N+1\)
(\(1 \leq K \leq N \leq 3 \cdot 10^5\)).
Процесс интервью проходит следующим образом. В момент времени \(0\)
фермер \(i\) начинает интервью с коровой \(i\) для каждого \(1 \leq i \leq K\).
После того, фермер заканчивает интервью он немедленно начинает
интервьюировать следующую корову по порядку. Если несколько фермеров
закончили интервью в одно и то же время, следующая корова может выбрать
сама к какому из фермеров пойдёт на интервью.
Для каждого \(1\le i\le N\), Беси знает, что интервью коровы \(i\) займёт ровно
\(t_i\) минут (\(1 \leq t_i \leq 10^9\)). Однако она не знает, какого фермера
предпочтёт каждая корова.
Поскольку работа очень важна для Беси, она хочет хорошо подготовиться
к интервью. Чтобы сделать это, она должна знать, когда она попадёт на интервью
и к какому фермеру может потенциально попасть.
Помогите найти эту информацию!
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка ввода содержит два целых числа \(N\) и \(K\).
Вторая строка ввода содержит \(N\) целых чисел \(t_1 \dots t_N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
На первой строке выведите время, в которое начнётся интервью Беси.
На второй строке выведите битовую строку длины \(K\), где \(i\)-ый бит равен
\(1\) если Беси может попасть на интервью к фермеру \(i\) и \(0\) в противном
случае.
| |
|
|
Cowmpetency
Жадный алгоритм
Задачи на моделирование
Задача на реализацию
Фермер Джон нанимает нового вожака стада для своих коров.
Для этого он интервьюирует \(N\) (\(2 \leq N \leq 10^5\)) коров на эту позицию.
После интервью \(i\)-го кандидата он назначает целое число "уровень компетенции"
\(c_i\) от \(1\) дo \(C\) включительно (\(1 \leq C \leq 10^9\)).
Поскольку ФД интервьюировал много коров, он не помнит все \(c_i\).
Однако он помнит \(Q\) (\(1 \leq Q < N\)) пар чисел \((a_j, h_j)\)
где корова \(h_j\) компетенция которой была строго больше,
чем уровень компетенции коров от \(1\) до \(a_j\) (\(1 \leq a_j < h_j \leq N\)).
ФД говорит Вам последовательность \(c_1, \dots, c_N\) (где \(c_i = 0\)
означает, что он забыл уровень компетенции коровы \(i\), и \(Q\) пар \((a_j, h_j)\).
Помогите ему определить лексикографически минимальную
последовательность уровней компетенции, соответствующую этой информации
или указать, что такой последовательности не существует. Последовательность
чисел называется лексикографически меньше другой последовательности
если в ней меньшее число не первой позиции, где эти последовательности
различаются.
Каждый ввод содержит \(T\) \((1 \leq T \leq 20)\) независимых подтестов.
Гарантируется, что сумма \(N\) по всем подтестам не превысит \(3 \cdot 10^5\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(T\), количество независимых подтестов.
Каждый подтест описывается так:
- Первая строка содержит \(N\), \(Q\), \(C\).
- Следующая строка содержит c1, \dots, cN\( \)(0 \leq ci \leq C)$.
- Каждая из последующих \(Q\) строк содержит пару \((a_j, h_j)\).
Гарантируется что все \(a_j\) в текущем подтесте различны.
ОРМАТ ВЫВОДА (на экран / stdout):
Для каждого подтеста выведите одну строку содержащую
лексикографически минимальную последовательность уровней компетенции,
соответствующую информации, которую помнит ФД, или \(-1\), если
такой последовательности не существует.
| |
|
|
Nap Sort
Жадный алгоритм
Задачи на моделирование
Беси сортирует массив целых чисел собственным алгоритмом.
У неё есть куча из \(N\) \((1 \leq N \leq 2\cdot 10^5)\) целых чисел \(a_1,a_2,\dots,a_N\)
\((1 \leq a_i \leq 10^{11})\), которые она хочет перенести в другой массив в
отсортированном порядке.
Она постоянно ищет минимальный элемент в куче, удаляет его и добавляет
в конец массива. Беси требуется \(p\) секунд, чтобы найти минимальный элемент
в куче из \(p\) целых чисел.
ФД выделил Беси в помощь неограниченное количество коров.
Беси использует их следующим образом. Она разделила все свои целые числа
на две кучи: куча Беси и куча Помощниц. Для каждого числа в своей куче она
выполняет алгоритм как обычно. Для каждого целого числа в куче Помощниц
Беси назначает его отдельной корове. И предлагает ей поступать так.
Когда корова помощница получает число \(a_i\), она должна подождать \(a_i\)
секунд и затем добавить это число в конец массива. Если Беси и корова-помощница
добавляют число в одно и то же время, то сначала добавляется число Беси.
Если нескольким коровам-помощницам было дано одно и то же число,
они добавляют копии этого числа в одно и то же время.
Помогите Беси поделить её числа так, чтобы финальный массив был отсортирован,
а время сортировки было минимально.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит число \(T\), количество независимых подтестов.
( \(1\le T\le 10\)).
Каждый подтест имеет такую структуру:
Первая строка содержит \(N\) - количество целых чисел в массиве Беси.
Следующая строка содержит \(a_1, a_2, \dots, a_N\), - целые числа, которые
сортирует Беси. Некоторые целые числа могут появится множество раз.
Гарантируется, что сумма всех \(N\) по всем подтестам не превысит \(2\cdot 10^5\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого подтеста выведите в отдельной строке минимальное время
сортировки массива, если Беси поделит числа оптимально.
| |
|
|
Majority Opinion
Жадный алгоритм
реализация
Задачи на моделирование
У Фермера Джона важная задача - решить какой тип сена купить для своих коров.
У Фермера Джона есть \(N\) коров (\(2 \le N \le 10^5\)) пронумерованных
от \(1\) до \(N\). Каждая корова любит ровно один тип сена \(h_i\) (\(1 \le h_i \le N\)).
ФД хочет, чтобы все его коровы любили один тип сена.
Чтобы это случилось, ФД может сформировать фокус-группы. Фокус-группа состоит
из всех коров в непрерывном интервале от \(i\) до \(j\), включительно. Если в
фокус-группе более половины коров любит один и тот же некоторый тип сена,
то все коровы начинают любить этот тип сена, иначе ни у одной коровы не
изменяется любимый тип сена. Например, если фокус группа состоит из 16 коров,
9 или более из которых любят один и тот же тип сена, то и остальные 7 коров
теперь будут любить этот же тип сена.
ФД хочет узнать, какие типы сена могут стать любимыми всем коровами.
В один момент времени он может создать только одну фокус группу, но он может
последовательно создавать сколько угодно фокус-групп, чтобы все коровы
полюбили один и тот же тип сена.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Сначала идёт одно целое число \(T\), которое обозначает количество независимых
тестов \((1 \leq T \leq 10)\).
Первая строка каждого теста содержит число \(N\).
Вторая строка каждого теста состоит из \(N\) целых чисел, любимых типов
сена \(h_i\), в порядке номеров коров.
Гарантируется, что сумма \(N\) во всех тестах не превысит \(2\cdot 10^5\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите \(T\) строк, по одной для каждого теста.
Если возможно сделать, чтобы все коровы полюбили один и тот же тип сена,
выведите все такие возможные типы сена в порядке возрастания. Иначе, выведите
\(-1\).
Когда выводите список чисел, выводите соседние числа через один пробел,
и в конце этой строки не должно быть пробелов.
| |
|
|
Balancing Bacteria
Жадный алгоритм
У Фермера Джона \(N\) (\(1\le N\le 2\cdot 10^5\)) участков травы на прямой,
где участок \(i\) имеет уровень бактерий, который отличается на \(a_i\) от
здоровой травы (\(-10^{15}\le a_i \le 10^{15}\)). Например, если \(a_i = -3\),
тогда кусок \(i\) имеет уровень бактерий на 3 меньше, чем нормальный.
И нужно прибавить ровно 3 дополнительных единицы бактерий, чтобы
уровень бактерий в этом куске рассматривался как нормальный.
ФД хочет обеспечить, чтобы каждый кусок травы был скорректирован,
чтобы получить нормальные уровни бактерий на них. У него есть два вида
пестицидов, один добавляет бактерии, другой удаляет бактерии.
ФД распространяет любой из двух видов пестицидов, стоя в куске \(N\)
(самом правом куске) и выбирает уровень мощности \(L\) (\(1 \leq L \leq N\)).
Сила действия спрейера уменьшается по мере увеличения расстояния от него.
Например, если фермер выберет пестицид, который добавляет бактерии, тогда
\(L\) единиц бактерий в участок \(N\), \(L-1\) единиц бактерий в участок \(N-1\), \(L-2\)
единицы бактерий в участок \(N-2\) и т.д. Участки \(1 \ldots N-L\) не получат
бактерий, поскольку мощность спрейера недостаточна, чтобы их достать.
Аналогично, если ФД выберет пестициды, которые удаляют бактерии, тогда
\(L\) единиц бактерий будет удалено с участка \(N\), \(L-1\) единиц бактерий
будет удалено с участка \(N-1\) и т.д. Опять, участки \(1 \ldots N-L\) будут
не изменены.
Определите минимальное количество раз, которое ФД должен применить
свой спрейер так, чтобы на каждом участке стало рекомендованное количество бактерийю
Гарантируется, что ответ не превысит \(10^9\).
Может потребоваться использование 64-битного типа данных
(например "long long" в C/C++)
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\).
Вторая строка содержит \(N\) целых чисел \(a_1\dots a_N\), начальный уровень
бактерий на каждом участке травы.
ФОРМАТ ВЫВОДА (на экран / stdout):
Минимальное количество применений спрейера так, чтобы каждый участок травы
получил нормальное значение бактерий на нём.
| |
|
|
Test Tubes
Жадный алгоритм
п»ї
Беси занялась химией. В данный момент у неё есть жидкости двух различных цветов
\(1\) и \(2\), которые плохо смешиваются одна с другой. У неё также есть две различных
колбы бесконечной емкости наполненные \(N\) \((1 \leq N \leq 10^5)\) единицами
смесей жидкостей этих двух цветов. Смеси делятся на слои отдельных цветов.
Поэтому колбы можно рассматривать как строки
\(f_1f_2\ldots f_N\) Рё
\(s_1s_2\ldots s_N\)
РіРґРµ
\(f_i\) представляет цвет жидкости, которая находится на высоте \(i\) единиц
от дна первой колбы,
\(s_i\) представляет цвет жидкости, которая находится на высоте \(i\) единиц
от дна второй колбы,
Беси хочет разделить эти жидкости так, чтобы каждая колба содержала
все единицы жидкости одного цвета.
У Беси есть также пустой стакан бесконечной емкости, чтобы помочь ей решить
её задачу. Когда Беси делает одно переливание, она переливает всю жидкость цвета
\(i\) наверх из одной колбы в другую или в стакан.
Определите минимальное количество переливаний, чтобы разделить жидкости
по колбам и серию переливаний, которые необходимо для этого выполнить.
Не имеет значения какого цвета жидкость будет содержаться в какой колбе,
но стакан должен быть пустым.
В каждом тесте будет \(T\) (\(1 \leq T \leq 10\)) подтестов с параметром
\(P\) для каждого подтеста.
Предположим, что минимальное количество переливаний, чтобы разделить
жидкости по колбам равно \(M\).
- если \(P=1\), Вы получите баллы, если выведите только \(M\).
- Если \(P=2\), Вы получите баллы, если выведите целое число \(A\) такое, что
\(M \leq A \leq M+5\), за которым следует \(A\) строк, которые конструируют
это решение за \(A\) ходов. Каждая строка должна содержать описание источника
и приемника жидкости (\(1\), \(2\), или \(3\) для стакана).
Колба-источник должна быть непустой перед переливанием,
и нельзя переливать в себя.
- If \(P=3\), Вы получите баллы, если выведите \(M\), за которым
следует правильная конструкция, использующая это количество ходов.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(T\), количество подтестов.
Для каждого подтеста следующая строка содержит \(N\) и \(P\),
насколько изначально заполнена каждая колба и тип запроса.
Следующая строка содержит
\(f_1f_2f_3\ldots f_N\) представляющая первую колбу.
\(f_i \in \{ 1,2 \}\) и \(f_1\) представляет дно первой колбы.
Следующая строка содержит
\(s_1s_2s_3\ldots s_N\) представляет вторую колбу, где S 1
\(s_i \in \{ 1,2 \}\) b \(s_1\) представляет дно второй колбы.
Гарантируется, что в каждой из этих входных строк числа
\(1\) и \(2\) встретятся не менее, чем по одному разу.
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого подтеста выведите одно целое число представляющее
минимальное количество переливаний, необходимое чтобы разделить жидкости по двум колбам.
В зависимости от вида запроса, Вы должны вывести корректную конструкцию.
ПР�МЕРВВОДА:
6
4 1
1221
2211
4 2
1221
2211
4 3
1221
2211
6 3
222222
111112
4 3
1121
1222
4 2
1121
1222
ПР�МЕРВЫВОДА:
4
4
1 2
1 3
2 1
3 2
4
1 2
1 3
2 1
3 2
1
2 1
5
2 3
1 2
1 3
1 2
3 1
6
2 3
1 2
1 3
1 2
2 1
3 2
В первых трёх подтестах минимальное количество переливаний, чтобы
разделить жидкости по колбам равно \(4\).
Вот как это делается
1: 1221
2: 2211
3:
После шага "1 2":
1: 122
2: 22111
3:
После шага "1 3":
1: 1
2: 22111
3: 22
После шага "2 1":
1: 1111
2: 22
3: 22
После шага "3 2":
1: 1111
2: 2222
3:
В последнем подтесте пминимальное количество переливаний - \(5\).
Однако, поскольку \(P=2\),
то данная конструкция с \(6\)-ю ходами корректна, посокльку она не более чем на \(5\)
переливаний от оптимального ответа.
ОЦЕН�ВАН�Е:
- Тесты 2-6: \(P = 1\)
- Тесты 7-11: \(P=2\)
- Тесты 12-21: Нет дополнительных ограничений.
Дополнительно, гарантируется, что \(T=10\) для всех подтестов, кроме
тех что приведены в условии.
Автор: Suhas Nagar
| |
|
|
Moorbles
Жадный алгоритм
Разбор случаев
Беси и Эльза играют с шариками так: Беси и Эльза начинают игру с некоторым
количеством шариков. Беси берёт \(A\) шариков из своих, а Эльза должна угадать
является ли число \(A\) чётным или нечётным. Если Эльза угадает, она забирает
эти \(A\) шариков, если нет - она отдаёт \(A\) своих шариков Беси. Если у Эльзы нет
\(A\) шариков - она проиграла. Игрок проиграл, если остался без шариков.
После нескольких этапов игры, у Эльзы осталось \(N\) \((1 \leq N \leq 10^9)\)
шариков. Она думает, что ей тяжело выиграть, она играет, чтобы не проиграть.
Она хорошо изучила привычки Беси и заметила, что на \(i\)-ом ходу есть только
\(K\) \((1 \leq K \leq 4)\) различных количеств шариков, которые может
предложить Беси. Проходит всего только \(M\) \((1 \leq M \leq 3 \cdot 10^5)\)
ходов прежде, чем Беси надоест, и она перестанет играть.
Можете ли Вы определить лексикографически минимальную последовательность
ходов такую, чтобы Эльза не проиграла вне зависимости от ходов Беси.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит целое число \(T\) ( \(1 \leq T \leq 10\)) представляющее
количество подтестов. Каждый подтест описывается следующим образом:
- Сначала идёт строка, содержащая три целых числа \(N\), \(M\), \(K\),
представляющая количество шариков у Эльзы, количество ходов, и количество
потенциальных ходов, которые может сделать Беси, соответственно.
- Затем идут \(M\) строк, где строка \(i\) содержит \(K\) различных
разделённых одиночными пробелами целых чисел
\(a_{i,1} \; a_{i,2} \ldots a_{i,K}\) (\(1 \leq a_{i, j} \leq 10^3\))
представляющих возможные количества шариков, которые Беси может выложить
на \(i\)-ом ходу.
Гарантируется. что сумма \(M\) по всем подтестам не более \(3 \cdot 10^5\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого подтеста выведите лексикографически минимальную последовательность
ходов Эльзы, которая гарантирует, что Эльза не проиграет или \(-1\), если Эльза
проиграет. Последовательность ходов должна быть на одной строке и состоять из
разделённых одиночными пробелами токенов, каждый из которых равен либо
"Even" либо "Odd".
Замечание: "Even" лексикографически меньше чем "Odd".
| |
|
|
Lazy Cow
Жадный алгоритм
Беси готовит тесты для олимпиады. Каждую минуту она может выбрать не готовить
никакие тесты для экономии энергии или потратить \(3^{a-1}\) энергии для подготовки
\(a\) тестов для некоторого положительного целого \(a\).
У Фермера Джона есть \(D\) (\(1\le D\le 2\cdot 10^5\)) требований. Для \(i\)-го
требования он говорит Беси, что в течение первых \(m_i\) минут она должна приготовить
не менее чем \(b_i\) тестов (\(1\le m_i\le 10^6, 1 \leq b_i \leq 10^{12}\)).
Пусть \(e_i\) - минимальное количество энергии, которое необходимо Беси, чтобы
удовлетворить первые \(i\) требований. Выведите \(e_1,\dots,e_D\) по модулю \(10^9+7\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(D\). \(i\)-ая из следующих \(D\) строк содержит два
разделённых одиночным пробелом целых числа \(m_i\) и \(b_i\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите \(D\) строк, где \(i\)-ая строка содержит \(e_i \text{ mod } 10^9+7\).
| |
|
|
Milk Exchange
Жадный алгоритм
п»ї
\(N\) \((1 \leq N \leq 2 \cdot 10^5)\) коров Фермера Джона выстроены в круг
так, что для каждой коровы \(i\) в промежутке \(1,2,\dots,N-1\), справа от коровы
\(i\) расположена корова \(i+1\), а справа от коровы \(N\) находится корова \(1\).
У каждой коровы имеется ведро целочисленной ёмкостью \(a_i\)
\((1 \leq a_i \leq 10^9)\) литров. Все вёдра изначально заполнены молоком.
Каждую минуту коровы обменивается молоком по правилу, описанному в строке
\(s_1s_2\dots s_N\) , состоящей только из символов \(\text{�L’}\) и \(\text{�R’}\).
Если у коровы есть хотя бы \(1\) литр молока, она отдаст ровно \(1\) литр молока
корове слева от неё, если \(s_i=\text{�L’}\), или справа от неё, если
\(s_i=\text{�R’}\). Все обмены происходят одновременно (то есть, если у коровы
полное ведро и она отдаёт литр молока и получает литр молока, то её молоко
сохраняется). Если количество молока превысит \(a_i\), то лишнее молоко будет утеряно.
ФД хочет узнать после \(M\) минут \((1 \leq M \leq 10^9\)), какое количество
молока останется у всех коров.?
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\) и \(M\).
Вторая строка содержит строку \(s_1s_2\dots s_N\) состоящую только из
символов \(\text{�L’}\) или \(\text{�R’}\), обозначающих направление, в котором
каждая корова будет передавать своё молоко.
Третья строка содержит целые числа \(a_1, a_2, \dots, a_N\), ёмкости каждого
ведра.
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите одно целое число, сумму молока всех коров после \(M\) минут.
Заметим, что требуется использовать 64-битный целый тип
(например, "long long" в C/C++).)
ПР�МЕРВВОДА:
3 1
RRL
1 1 1
ПР�МЕРВЫВОДА:
2
Коровы \(2\) и \(3\) передадут друг другу по 1 литру молока, поэтому их молоко сохранится.
Когда корова \(1\) передаст свой литр молока корове \(2\), ведро у той переполнится
и один литр молока будет потерян на 1-ой минуте.
ПР�МЕРВВОДА:
5 20
LLLLL
3 3 2 3 3
ПР�МЕРВЫВОДА:
14
Каждая корова передаёт литр молока и получает литр молока, поэтому всё молоко сохранится
вне зависимости от количества минут.
ПР�МЕРВВОДА:
9 5
RRRLRRLLR
5 8 4 9 3 4 9 5 4
ПР�МЕРВЫВОДА:
38
�значально имеется всего 51 литр молока. Через 5 минут
коровы \(3\), \(6\), \(7\) потеряют 5, 3, 5 литров соответственно.
Поэтому останется 38 литров молока.
ОЦЕН�ВАН�Е:
- Тесты 4-8: \(N,M \le 1000\)
- Тесты 9-16: Нет дополнительных ограничений.
Авторы: Chongtian Ma, Alex Liang
| |
|
|
Deforestation
Жадный алгоритм
п»ї
Фермер Джон расширяет свою ферму! Он определил совершенное место -
Красно-Чёрный Лес, который состоит из \(N\) деревьев (\(1 \le N \le 10^5\))
на числовой прямой, где \(i\)-ое дерево находится в позиции \(x_i\)
(\(-10^9 \le x_i \le 10^9\)).
Закон по защите окружающей среды ограничивает, какие деревья может спилить ФД,
освобождая место под свою ферму. Всего имеется \(K\) ограничений
(\(1 \leq K \leq 10^5\)), указывающих, что должно быть как минимум \(t_i\)
деревьев на отрезке \([l_i, r_i]\), включая конечные точки
(\(-10^9 \le l_i, r_i \le 10^9\)). Гарантируется, что изначально Красно-Чёрный Лес
удовлетворяет этим ограничениям.
ФД хочет чтобы его ферма была как можно большей. Помогите ему вычислить
максимальное количество деревьев, которое он может спилить, удовлетворяя
данным ограничениям.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Каждый ввод состоит из \(T\) (\(1 \le T \le 10\)) независимых подтестов.
Гарантируется, что сумма всех \(N\) и всех \(K\) внутри каждого ввода не превысят
\(3 \cdot 10^5\).
Первая строка ввода содержит \(T\). Каждый тест представлен в следующем формате:
- Первая строка содержит целые числа \(N\) и \(K\).
- Следующая строка содержит \(N\) целых чисел \(x_1, \dots, x_N\).
- Каждая из последующих \(K\) строк содержит три разделённых одиночными
пробелами целых числа: \(l_i\), \(r_i\), \(t_i\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого подтеста выведите одну строку с целым числом, обозначающим
максимальное количество деревьев, которое может срезать ФД.
ПР�МЕРВВОДА:
3
7 1
8 4 10 1 2 6 7
2 9 3
7 2
8 4 10 1 2 6 7
2 9 3
1 10 1
7 2
8 4 10 1 2 6 7
2 9 3
1 10 4
ПР�МЕРВЫВОДА:
4
4
3
Для первого подтеста, ФД может срезать первые 4 дерева, оставив
деревья в точках \(x_i = 2, 6, 7\), чтобы удовлетворить ограничениям.
Для второго подтеста, ФД дополнительные ограничения не влияют, поэтому
ФД может срезать те же самые деревья.
Для третьего подтеста, ФД может срезать не более \(3\) деревьев,
потому что изначально \(7\) деревьев, однако второе ограничение требует
чтобы он оставил как минимум \(4\) дерева не срезанными.
ОЦЕН�ВАН�Е:
- Тест 2: \(N, K \le 16\)
- Тесты 3-5: \(N, K \le 1000\)
- Тесты 6-7: \(t_i = 1\) for all \(i = 1, \dots, N\).
- Тесты 8-11: Нет дополнительных ограничений.
Авторы: Tina Wang, Jiahe Lu, Benjamin Qi
| |
|
|
It's Mooin' Time
Жадный алгоритм
**Замечание: Время на тест для этой задачи 3 сек, в 1.5 больше
чем по умолчанию.**
У Беси есть строка длины \(N\) (\(1\le N\le 3\cdot 10^5\)) состоящая только
из символов M и O. Для каждой позиции \(i\) в этой строке есть цена замены
(\(1\le c_i\le 10^8\)) этого символа на другой.
Беси думает, что строка будет выглядеть лучше, если она будет содержать
больше moo длиной \(L\) (\(1\le L\le \min(N, 3)\)). Moo длиной \(L\) is
символ M за которым следуют \(L-1\) символов O.
Для каждого положительного целого \(k\) от \(1\) до \(\lfloor N/L\rfloor\)
включительно, вычислите минимальную стоимость изменить строк так,
чтобы она содержала как минимум \(k\) подстрок равных moo длины \(L\).
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(L\) и \(N\).
Следующая строка содержит строку Беси длиной \(N\), состоящую только из
символов M и O.
Следующая строка содержит разделённые одиночными пробелами целые числа
\(c_1\dots c_N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите \(\lfloor N/L\rfloor\) строк, ответов для каждого \(k\)
в порядке возрастания.
| |
|
|
Job Completion
Жадный алгоритм
У Беси есть \(N\) (\(1\le N\le 2\cdot 10^5\)) работ для Вас. Если Вы выберете
\(i\)-ую работу, её необходимо начать в момент времени \(s_i\) или до него и для
её завершения требуется \(t_i\) единиц времени.
(\(0\le s_i\le 10^{18}, 1\le t_i\le 10^{18}\)).
Какое максимальное количество работ Вы успеете выполнить?
Время начинается с \(0\),и, если Вы начали работу, Вы сначала должны
выполнить и только потом начинать другую работу.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(T\), количество независимых подтестов ( \(1\le T\le 10\)).
Каждый подтест представлен следующим образом:
Первая строка содержит число \(N\).
Каждая из последующих \(N\) строк содержит два целых числа \(s_i\) и \(t_i\).
Строка \(i+1\) содержит описание \(i\)-ой работы.
Гарантируется, что сумма \(N\) по всем подтестам не превысит
\(3\cdot 10^5\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого подтеста в отдельной строке выведите максимальное количество работ
которое Вы сможете выполнить.
| |
|
|
Moo Language
Жадный алгоритм
Фермер Джон заинтересован в лучшем общении со своими собратьями-коровами, поэтому он
решил, что он выучит язык мычания!
Язык Moo на самом деле очень похож на английский, но более минималистичный. Там
всего четыре типа слов: существительные, переходные глаголы, непереходные глаголы и
союзы. Каждые два последовательных слова должны быть разделены пробелом. Там
также всего два вида знаков препинания: точки и запятые. Когда точка или
запятая ставится после слова, она ставится сразу после слова, а затем
с последующим пробелом, если рядом появляется другое слово.
Предложение должно соответствовать одному из следующих форматов:
- Тип 1: существительное + непереходный глагол.
- Тип 2: существительное + переходный глагол + существительное(а). В частности, хотя бы одно существительное
должен следовать за переходным глаголом, и перед каждым словом должна стоять запятая.
следующее существительное, кроме первого следующего существительного.
Два предложения можно соединить в сложносочиненное, если поставить союз
между ними. Полученное сложносочиненное предложение не может быть далее объединено с
другими предложениями или другими сложными предложениями. Каждое предложение (или составное
предложение, если два предложения соединены) должно заканчиваться точкой.
У фермера Джона есть банк слов из \(N\) слов, \(C\) запятых и \(P\) точек.
(\(1 \leq P,C\le N \leq 10^3\)). Он может использовать слово или знак препинания столько раз
раз, сколько это появляется в банке слова. Помогите ему вывести последовательность
предложений, содержащую максимально возможное количество слов.
Каждый входной файл содержит \(T\) (\(1\le T\le 100\)) подтестов.
ФОРМАТ ВВОДА (с клавиатуры/стандартного ввода):
Первая строка содержит \(T\), количество подтестов. Каждый подтест указывает
следующее:
Первая строка состоит из трех целых чисел: \(N\), \(C\) и \(P\).
Следующие \(N\) строк будут состоять из двух подстрок, разделённых одиночным пробелом.
Первая подстрока будет само слово, которое может использовать FJ (строка не менее 1 и не более 10 строчных букв
буквы), а вторая подстрока будет одной из следующих: noun,
transitive-verb, intransitive-verb, conjunction, ( соответсвенно существительное,
переходный глагол, непереходный глагол или союз) обозначающие тип этого
слова. Возможно, одно и то же слово встречается более одного раза в банке слов FJ, но
оно всегда будет иметь один и тот же тип при каждом появлении.
ФОРМАТ ВЫВОДА (на терминал / стандартный вывод):
В первой строке выведите максимально возможное количество слов.
Во второй строке выведите любую последовательность предложений с максимально возможным
числом слов. Любая допустимая последовательность будет принята.
Грейдер чувствителен к пробелам, поэтому убедитесь, что не выводятся
лишние пробелы, особенно в конце каждой строки.
| |
|
|
Moo Route
Жадный алгоритм
В момент времени \(t=0\) Беси расположена в точке \(x=0\) на бесконечной
числовой прямой. Она двигается влево или вправо каждую секунду. Однако
после \(T\) секунд Беси возвращается в точку \(x=0\).
Фермер Нхой знает сколько раз Беси пересекала точки \(x=.5, 1.5, 2.5, \ldots, (N-1).5\),
и это задаётся числами массива \(A_0,A_1,\dots,A_{N-1}\)
(\(1\leq N \leq 10^5\), \(1 \leq A_i \leq 10^6\), \(\sum A_i\le 10^6\)).
Беси никогда не попадает ни в \(x>N\) ни в \(x<0\).
В частности, маршрут Беси может быть представлен строкой символов
\(T = \sum_{i=0}^{N-1} A_i\) \(L\) и \(R\), где \(i\)-ый символ представляет
направление движения Беси во время \(i\)-ой секунды. Количество изменений
направления движения определяется как количество \(LR\) плюс количество \(RL\).
Помогите ФН найти любой маршрут Беси, который соответствует массиву \(A\)
и имеет минимальное количество изменений направления движения.
Гарантируется существование как минимум одного такого маршрута.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\). Вторая строка содержит \(A_0,A_1,\dots,A_{N-1}\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите строку \(S\) длины \(T = \sum_{i=0}^{N-1} A_i\) где \(S_i\) это \(L\) или
\(R\), указывающие направление движения Беси в течение секунды \(i\). Если имеется
несколько маршрутов, выводите тот, в котором минимальное количество изменений
направления движения. Если таких несколько, выводите любой.
| |
|
|
Moo Route
Жадный алгоритм
В момент времени \(t=0\), Беси находится в точке \(x=0\) на бесконечной числовой прямой.
Она двигается на \(1\) влево или вправо каждую секунду. Ровно через \(T\) секунд
она возвращается в точку \(x=0\).
Фермер Нхой знает, сколько раз Беси пересекала точки \(x=.5, 1.5, 2.5, \ldots, (N-1).5\),
и это задаётся массивом \(A_0,A_1,\dots,A_{N-1}\) (\(1\leq N \leq 10^5\), \(1 \leq A_i \leq 10^6\)).
Беси никогда не достигнет ни \(x>N\), ни \(x<0\).
В частности, маршрут Беси может быть представлен строкой \(T = \sum_{i=0}^{N-1} A_i\)
символов \(L\) и \(R\), где \(i\)-ый символ представляет направление, в котором двигалась Беси
в течение \(i\)-ой секунды. Количество изменений направления определяется как количество
пар символов \(LR\) плюс количество пар символов \(RL\) в этой строке.
Помогите ФН посчитать количество маршрутов, соответствующих массиву \(A\)
с минимальным количеством изменений направления движения. Гарантируется существование
как минимум одного такого маршрута.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\). Вторая строка содержит \(A_0,A_1,\dots,A_{N-1}\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Количество маршрутов Беси по модулю \(10^9+7\).
| |
|
|
Watching Mooloo
Жадный алгоритм
Беси любит смотреть шоу на сервисе Mooloo. Поскольку Беси очень занятая корова,
она создаёт план на следующие \(N\) (\(1 \leq N \leq 10^5\)) дней в течение которых
будет смотреть шоу. Mooloo - платный сервис и она хочет минимизировать оплату.
У Mooloo интересная система подписки: она стоит \(d + K\) денег (\(1\le K\le 10^9\)),
чтобы подписаться на \(d\) последовательных дней. Вы можете начать подписку в любой день.
И Вы можете начать новую подписку, если текущая подписка истекла.
Определите минимальное количество денег, чтобы заплатить за просмотр шоу.
ФОРМАТ ВВОДА (с клавитауры / stdin):
Первая строка содержит целые числа \(N\) и \(K\).
Вторая строка содержит \(N\) целых чисел описывающих дни, в которые Беси планирует смотреть
шоу: \(1\le d_1<d_2<\dots<d_N\le 10^{14}\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Рекомендуется использовать 64-битный целый тип для ответа (например "long long" в C/C++).
| |
|
|
Bovine Acrobatics
Жадный алгоритм
Фермер Джон решил потренировать своих коров в акробатике. Сначала он
взвесил своих коров и определил, что они имеют \(N\) (\(1\le N\le 2\cdot 10^5\))
различных весов. В частности, для каждой \(i\in [1,N]\), \(a_i\) из его
коров имеют вес \(w_i\) (\(1\le a_i\le 10^9, 1\le w_i\le 10^9\)).
Его наиболее популярный трюк включает коров, формирующих сбалансированную башню.
Башня это последовательность коров, стоящих одна на другой.
Башня называется сбалансированной, если каждая корова с коровой над ней
имеет вес не менее чем на (\(1\le K\le 10^9\)) больший, чем вес коровы непосредственно
над ней. Каждая корова может быть частью не более чем одной сбалансированной башни.
Если ФД хочет создать не более \(M\) (\(1 \le M \le 10^9\)) сбалансированных башен
из своих коров, какое наибольшее количество коров может быть частью некоторой башни?
ФОРМАТ ВВОДА (с клавиатуры):
Первая строка содержит три разделённых пробелом целых числа \(N\), \(M\), \(K\).
Следующие \(N\) строк содержат два разделённых пробелом целых числа \(w_{i}\) и \(a_i\).
Гарантируется, что все \(w_i\) различны.
ФОРМАТ ВЫВОД (на экран):
Выведите максимальное количество коров в сбалансированных башнях, если ФД
поможет сформировать эти башни оптимально.
| |
|
|
Train Scheduling
Жадный алгоритм
Теория расписаний
Задачи на моделирование
**Замечание: Ограничение по памяти для этой задачи 512MB, в два раза больше значения по умолчанию.**
Беси приняли на новую работу - диспетчером поездов. Имеется две железнодорожные
станции \(A\) и \(B\). В связи с ограничением бюджета, эти станции соединены только
одной дорогой. Если поезд отправляется от одной станции в момент времени \(t\),
тогда он прибудет на другую станцию в момент времени \(t+T\) (\(1\le T\le 10^{12}\)).
Имеется \(N\) (\(1\le N\le 5000\)) поездов для которых нужно установить время отправки.
\(i\)-ый поезд должен покинуть станцию \(s_i\) в момент времени $ti или позже
(\(s_i\in \{A, B\}, 0\le t_i\le 10^{12}\)).
Запрещено иметь поезда, которые движутся в противоположных направлениях в
один и тот же момент времени (поскольку они столкнутся). Однако разрешено иметь
множество поездов, которые еду в одном направлении в одно и то же время
(предполагаем, что поезда имеют пренебрежимо малые размеры)
Помогите Беси спланрировать времена отправления так, чтобы не было столкновений,
а общая задержка была минимальной. Если поезд спланирован на убытие
в момент времени \(a_i\ge t_i\), общая задержка определяется как \(\sum_{i=1}^N(a_i-t_i)\).
ФОРМАТ ВВОДА (с клавиатуры):
Первая строка содержит \(N\) и \(T\).
Затем следуют \(N\) строк, где i-ая строка содержит станции \(s_i\) и время \(t_i\),
соответствующие \(i\)-ому поезду.
ФОРМАТ ВЫВОДА (на экран):
Минимально возможная общая задержка всех корректных планирований.
| |
|
|
Farmer John Actually Farms
Жадный алгоритм
Задачи на моделирование
Вывод формулы
Фермер Джон вырастил \(N\) (\(1 \leq N \leq 2\cdot 10^5\)) аспарагусов на своей
ферме. Однако некоторые из этих растений имеют генетические отличия, поэтому
некоторые растения растут быстрее чем другие. Изначальная высота \(i\)-го
растения равна \(h_i\) дюймов и после каждого дня \(i\)-ое растение вырастает
на \(a_i\) дюймов.
ФД любит некоторые растения больше чем другие, и он хочет, чтобы некоторые
растения были выше чем другие. Он дал Вам массив различных целых чисел
\(t_1,\dots,t_N\), содержащих все целые числа от \(0\) до \(N-1\) и хочет, чтобы
\(i\)-ое растение имело ровно \(t_i\) растений, которые выше этого. Определите
минимальное количество дней, чтобы требование ФД было удовлетворено или укажите,
что это невозможно.
ФОРМАТ ВВОДА (с клавиатуры):
Первая строка состоит из целого числа \(T\), обозначающего количество
независимых тестов \((1 \leq T \leq 10)\).
Первая строка каждого теста состоит из целого числа \(N\).
Вторая строка состоит из \(N\) целых чисел \(h_i\) \((1 \leq h_i \leq 10^9)\),
обозначающих изначальную высоту \(i\)-го растения в дюймах.
Третья строка состоит из \(N\) целых чисел \(a_i\) \((1 \leq a_i \leq 10^9)\),
обозначающих количество дюймов, на которые \(i\)-ое растение вырастает каждый
день.
Четвёртая строка содержит \(N\) различных целых чисел \(t_i\), обозначающих
массив, который ФД даст Вам.
Гарантируется, что сумма всех \(N\) по всем тестам не превысит \(2\cdot 10^5\).
ФОРМАТ ВЫВОДА (с клавиатуры):
Выведите \(T\) строк, ответ на каждый тест на отдельной строке.
Если невозможно, выведите -1.
Заметим, что тесты этой задачи могут потребовать использования
64-битного целого типа (например, "long long" в C/C++).
| |
|
|
Cowntact Tracing 2
Жадный алгоритм
Задачи на моделирование
Фермер Джон выстроил в ряд свои \(N\) коров (\(1 \leq N \leq 3\cdot 10^5\)).
К несчастью, стала распространяться болезнь.
Изначально некоторые коровы инфицированы. Каждую ночь инфицированная корова
распространяет болезнь на коров соседних слева и справа, если они есть. Однажды
инфицированная корова остаётся инфицированной.
После некоторого количества ночей ФД понял, что ситуация выходит из-под контроля
поэтому он проверил своих коров, чтобы определить больных коров. Определите
минимальное количество коров, которые могли быть больными в самом начале.
ФОРМАТ ВВОДА (с клавиатуры):
Первая строка содержит \(N\), количество коров ФД.
Следующая строка содержит \(N\)-символьную битовую строку из цифр \(1\) и \(0\)
где \(1\) представляет инфицированную корову, а \(0\) представляет неинфицированную корову
после некоторого количества ночей.
ФОРМАТ ВЫВОДА (на экран):
Выведите одно целое число: минимальное количество коров, с которых
могла стартовать болезнь.
| |
|
|
Candy Cane Feast
Жадный алгоритм
Задачи на моделирование
реализация
Коровы Фермера Джона любят конфетные трости. У ФД \(N\) коров с определённой
начальной высотой. Он хочет скормить им \(M\) конфетных тростей, различной высоты
(\(1\le N,M\le 2\cdot 10^5\)).
ФД планирует кормить коров конфетными тростями одну за одной в порядке, в котором
они заданы на вводе. Чтобы кормить коров ФД вывешивает конфетные трости так, чтобы
изначально они касались земли. Коровы выстраиваются одна за одной в порядке, как они
заданы на входе. Каждая ест до своей высоты (потому что выше не достаёт).
Трость остаётся на месте где она изначально была подвешена и не опускается к земле,
даже после того как её нижняя часть съедена. Возможно, что когда подойдёт очередь
некоторой коровы она ничего не сможет съест, если нижняя часть трости уже выше высоты
этой коровы. После того как пройдёт очередь всех коров, они подрастают на высоту
равную количеству единиц трости, которую съела корова, а ФД вывешивает новую конфетную
трость и коровы повторяют процесс опять (корова 1 всегда начинает есть первой).
ФОРМАТ ВВОДА (с клавиатуры):
Первая строка содержит \(N\) и \(M\).
Следующая строка содержит начальные высоты \(N\) коров, каждая в интервале
\([1,10^9]\).
Следующая строка содержит высоты \(M\) конфетных тростей, каждая в интервале
\([1,10^9]\).
ФОРМАТ ВЫВОДА (на экран):
Финальные высоты каждой из \(N\) коров на отдельной строке.
Заметим, что значения, заданные в тестах могут потребовать использования
64-битного целого типа (например, "long long" в C/C++).
| |
|
|
Apple Catching
Жадный алгоритм
Падают яблоки!
В определённые моменты времени некоторое количество яблок падает в некоторые точки
числовой прямой. В определённый момент времени некоторые коровы появляются на числовой
прямой и НАЧИНАЮТ ловить яблоки.
Если яблоко падает на числовую прямую и корова его не поймала, оно исчезает бесследно.
Если корова и яблоко прибыли в одно и то же время, корова ловит яблоко. Каждая корова может
перемещаться на одну единицу за секунду. Если корова поймала яблоко, она покидает
числовую прямую.
Сколько максимально яблок смогут поймать коровы, если будут действовать сообща оптимально?
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(N\) ( \(1\le N\le 2\cdot 10^5\)), количество раз когда яблоки
падали на числовую прямую или там появлялись коровы.
Каждая из последующих \(N\) строк содержит четыре целых числа \(q_i\), \(t_i\), \(x_i\), \(n_i\)
(\(q_i\in \{1,2\}, 0\le t_i\le 10^9, 0\le x_i\le 10^9, 1\le n_i\le 10^3\)).
- Если \(q_i=1\), это значит, что \(n_i\) коров прибыли на числовую прямую в момент времени \(t_i\)
в позицию \(x_i\).
- Если \(q_i=2\), это значит, что \(n_i\) яблок упали на числовую прямую в момент времени \(t_i\)
в позицию \(x_i\).
Гарантируется, что все упорядоченные пары \((t_i,x_i)\) различны.
ФОРМАТ ВЫВОДА (на экран / stdout):
Максимальное количество яблок, которое коровы могут поймать сообща.
| |
|
|
Photoshoot
Жадный алгоритм
Фермер Джон пытается сделать совершенную фотографию своих \(N\) коров
(\(2 \leq N \leq 2\cdot 10^5\), \(N\) четное).
У ФД есть коровы двух пород Guernseys и Holsteins.
Чтобы сделать свою фотографию как можно более эстетичной, он хочет
выстроить своих коров так, чтобы как можно больше коров породы Guernseys
находились на позициях с чётными номерами (первая позиция в ряду - нечётная,
следующая чётная и т.д.). Для перестройки порядка коров он может только
попросить "префикс" своих коров четной длины сделать реверс.
"Префикс" состоит из диапазона коров от первой коровы до \(j\)-ой коровы для
некоторой позиции \(j\).
Вычислите минимальное количество реверсов, которое потребуется ФД
для достижения своей цели.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка ввода содержит величину \(N\).
Вторая строка ввода содержит набор символов длины \(N\), указывающих
начальный порядок коров слева направо. Символ 'H' представляет породу Holstein,
а символ 'G' представляет породу Guernsey.
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите минимальное количество реверсов.
| |
|
|
Counting Liars
Жадный алгоритм
Префиксные суммы(минимумы, ...)
Задачи на моделирование
Корова Беси прячется где-то на числовой прямой.
Каждая из \(N\) (\(1\le N\le 1000\)) других коров Фермера Джона имеет информацию, которой
она делится с ФД: \(i\)-ая корова говорит, что Беси прячется в некоторой точке
меньше либо равной to \(p_i\), или больше либо равной \(p_i\), (\(0\le p_i\le 10^9\)).
К несчастью, возможна ситуация противоречивости ответов всех коров. Это означает,
что не все коровы говорили правду. Вычислите минимальное количество коров,
которые солгали.
ФОРМАТ ВВОДА (С КЛАВИАТУРЫ / stdin):
Первая строка содержит \(N\).
Каждая из следующих \(N\) строк содержит символ L или G, за которым следует
целое число \(p_i\). L означает, что \(i\)-ая корова говорит, что Беси скрывается
в позиции меньше либо равной \(p_i\), а G означает, что \(i\)-ая корова говорит,
что Беси скрывается в позиции больше либо равной \(p_i\)
ФОРМАТ ВЫВОДА (на экран / stdout):
Минимальное количество коров, которые солгали.
| |
|
|
Drought
Жадный алгоритм
\(N\) (\(1 \leq N \leq 10^5\)) коров Фермера Джона выстроены в ряд так, что
\(i\)-ая корова в этому ряду имеет уровень голода \(h_i\) (\(0 \leq h_i \leq 10^9\)).
Поскольку коровы - социальные животные и хотят есть вместе, единственный способ
уменьшить уровень голода его коров - выбрать двух соседних коров с номерами
\(i\) и \(i+1\) и скормить каждой из них по мешку кукурузы, чтобы уменьшить уровень
голода каждой из них на один.
ФД хочет накормить своих коров так, чтобы все имели один и тот же некоторый
не отрицательный уровень голода. Помогите ФД определить минимальное количество
мешков кукурузы, которое ему потребуется, или -1, если это сделать невозможно.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Каждый ввод состоит из нескольких независимых тестов, каждый из которых
нужно решить правильно, чтобы решить полностью входной тест. Первая строка
содержит \(T\) (\(1\le T\le 100\)) - количество тестов на вводе. Каждый тест описывается
парой строк. Первая строка в паре содержит \(N\), а вторая - \(h_1,h_2,\ldots,h_N\).
Гарантируется, что сумма всех \(N\) в тесте не превысит \(10^5\). Значения \(N\)
могут различаться внутри ввода.
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите \(T\) строк, по одной для каждого теста на вводе.
Заметим что требуется использовать 64-битное целое для ответа
(например "long long" в C/C++)
| |
|
|
Sleeping in Class
Жадный алгоритм
Префиксные суммы(минимумы, ...)
Задачи на моделирование
Беси радовалась введённому индивидуальному обучению.
К несчастью её тьютор Фермер Джон очень скучный лектор, и поэтому она часто
засыпала во время занятий.
ФД попросил Эльзу записывать количество раз, когда Беси засыпала на каждом занятии.
Всего было \(N\) занятий (\(2\le N\le 10^5\)), и Эльза зафиксировала \(a_i\)
(\(1\le a_i\le 10^{18}\)) засыпаний на \(i\)-ом занятии. Общее количество засыпаний
на всех занятиях не превышает \(10^{18}\).
Эльза хочет представить дело так, что Беси засыпала одинаковое количество раз
на каждом занятии.
Единственный способ Эльзы модифицировать свои записи - объединить два соседних
занятия или разъединить одно занятие на два. Например, если \(a=[1,2,3,4,5],\)
тогда если Эльза объединит второе и третье занятие, то лог станет \([1,5,4,5]\)
Если Эльза выберет разделить третье занятие на два, то лог может стать одним из
\([1,5,0,4,5]\), \([1,5,1,3,5]\), \([1,5,2,2,5]\), \([1,5,3,1,5]\), or \([1,5,4,0,5]\).
По заданным \(Q\) (\(1\le Q\le 10^5\)) кандидатам \(q_1,\ldots,q_Q\) для наименее
любимых Беси чисел (\(1\le q_i\le 10^{18}\)), для каждого из них помогите Эльзе вычислить
минимальное количество модификаций лога, чтобы все числа в нём стали одинаковыми.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка каждого теста содержит \(N\), а вторая содержит \(a_1,a_2,\ldots,a_N\).
Третья строка содержит \(Q\) - количество запросов, за которым следует \(Q\) строк
с целым числом \(q_i\) - кандидат в наименее любимое число Беси.
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого \(q_i\) вычислите минимальное количество модификаций, которое
требуется для Эльзы, чтобы конвертировать лог в \(q_i\) или выведите \(-1\),
если это невозможно.
| |
|
|
Sleeping in Class
Жадный алгоритм
Беси радовалась введению индивидуального обучения.
К несчастью, её тьютор Фермер Джон, очень скучный лектор, и поэтому она
часто засыпала на занятиях.
ФД это заметил и попросил Эльзу вести учёт засыпаний Беси.
Всего имеется \(N\) (\(1\le N\le 10^5\)) периодов, когда проходили занятия.
И Эльза записала, что Беси засыпала \(a_i\) (\(0\le a_i\le 10^6\)) раз во время
\(i\)-го периода. Общее количество засыпаний Беси не превышает \(10^6\).
Эльза хочет показать ФД, что Беси всегда засыпала одинаковое количество раз.
Но единственный способ, которым она это может сделать - объединить два соседних
периода проведения занятий. Например, если \(a=[1,2,3,4,5],\) то Эльза может объединить
второй и третий периоды и лог станет таким \([1,5,4,5]\).
Помогите Эльзе вычислить минимальное количество модификаций лога, которые она должна
сделать, чтобы сделать все числа лога равными.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Каждый ввод содержит \(T\) ( \(1\le T\le 10\)) тестов, которые нужно решать независимо.
Первая строка содержит \(T\) - количество тестов. Затем следуют \(T\) тестов,
каждый описывается парой строк. Первая строка пары содержит \(N\), а вторая
содержит \(a_1,a_2,\ldots,a_N\).
Гарантируется, что внутри каждого теста сумма всех \(a_i\) не превышает \(10^6\).
Также гарантируется, что сумма всех \(N\) в этих тестах не превысит \(10^5\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите \(T\), содержащих минимальное число модификаций, которое может выполнить
Эльза, чтобы уравнять все числа в логах для каждого теста.
| |
|
|
Photoshoot 2
Жадный алгоритм
Фермер Джон выстроил в ряд своих \(N\) коров для фотографии.
Изначально коровы выстроились в порядке \(a_1,a_2,\ldots,a_N\) слева направо.
Цель ФД выстроить их в порядке \(b_1,\ldots,b_N\) слева направо.
Чтобы достичь своей цели, ФД может выполнить несколько модификаций порядка.
Каждая модификация состоит в том, чтобы выбрать корову и переместить её влево
на некоторое количество позиций.
Вычислите минимальное количество модификаций, которое потребуется ФД,
чтобы выстроить коров в желаемом порядке.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка ввода содержит \(N\). Вторая строка содержит \(a_1,a_2,\ldots,a_N\).
Третья строка содержит \(b_1,b_2,\ldots,b_N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите минимальное количество модификаций, требуемое ФД для получения
желаемого порядка.
| |
|
|
Bribing Friends
дп
Жадный алгоритм
жадные алгоритмы
Беси хочет посмотреть Bovine Genomics: The Documentary, но она не
хочет идти одна. К сожалению, её друзья не очень хотят идти с ней. Ей нужно чем то их привлечь.
У неё есть два инструмента : mooney и мороженое.
У Беси \(N\) (\(1 \le N \le 2000\)) друзей. Однако они разные!
Друг \(i\) имеет счёт популярности \(P_i\) (\(1 \le P_i \le 2000\)), и Беси хочет
максимизировать сумму популярности друзей, которые пойдут с ней.
Друг \(i\) пойдёт с ней только если она даст ему \(C_i\) (\(1 \le C_i \le 2000\)) "moonies".
Друг \(i\) также может сделать скидку в \(1\) "mooney", если она даст ему \(X_i\)
(\(1 \le X_i \le 2000\)) мороженых. Беси может получить сколько угодно скидок.
У Беси есть \(A\) moonies и \(B\) мороженых (\(0 \le A, B \le 2000\)).
Помогите ей определить максимальную сумму популярностей, которую она может
добиться, если потратит mooney и мороженое оптмально.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Строка \(1\) содержит три числа \(N\), \(A\), \(B\), представляющих количества друзей,
mooney и мороженых, которые есть у Беси соответственно.
Каждая из последующих \(N\) строк содержит три числа \(P_i\), \(C_i\), \(X_i\),
представляющих популярность (\(P_i\)), mooney, за которые он согласится пойти,
количество мороженых для скидки в \(1\) mooney для друга \(i\) (\(X_i\)).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите максимальную сумму популярностей друзей Беси, в предположении
что она оптимально потратит moonie и мороженые.
| |
|
|
Feeding the Cows
Жадный алгоритм
У Фермера Джона имеется \(N\) (\(1 \le {N} \le {10^5}\)) коров, каждая из которых имеет
породу или Guernsey(G) или Holstein(H). Они выстроились в ряд заняв позиции \(1\dots N\).
Поскольку все коровы голодные, ФД решил выложить пакты с травой в некоторых
позициях \(1\dots N\). Коровы разных пород едят разные типы травы. Каждый пакет
травы должен содержать траву только одного типа (для G или для H). Он не может
разместить пакеты с разной травой в одной и той же позиции. Каждый пакет травы
может накормить неограниченное количество коров соответствующего типа.
Каждая корова готова пройти не более \(K\) (\(0 \le {K} \le N-1\)) позиций
чтобы добраться до пакета с травой. Определите минимальное количество пакетов
с травой, необходимое чтобы накормить всех коров. Любая конфигурация, удовлетворяющая
указанным выше ограничениям, будет рассматриваться как корректная.
ФОРМАТ ВВОДА (с клавитатуры / stdin):
Каждый тест состоит из \(T\) подтестов, описывающих расположение коров.
Первая строка сдержит \(T\) ( \(1 \le T \le 10\)). Далее следует \(T\) подтестов.
Каждый подтест начинается со строки содержащей \(N\) и \(K\).
Следующая строка содержит строку длины \(N\), в которой каждый символ
обозначает породу коровы на позиции \(i\) (G или H).
ФОРМАТ ВЫВОДА (на экран / stdout):
Для каждого из \(T\) подтестов выведите две строки.
В первой строке выведите минимальное количество пакетов с травой, которые требуются.
Во второй строке нужно вывести строку из \(N\) символов, которая описывает Ваше решение.
\(i\)-ый символ этой строки указывает что нужно разместить в позиции \(i\):
'.' - ничего
'G' - пакет с травой типа G
'H' - пакет с травой типа H
Любая корректная конфигурация будет принята.
| |
|
|
Uddered but not Herd
Жадный алгоритм
Это малоизвестный факт, что у коров свой алфавит - "cowphabet".
Он состоит из 26 букв от a' до 'z', однако порядок букв в этом "cowphabet"
может отличаться от стандартного порядка 'abcdefghijklmnopqrstuvwxyz'.
Коротая время, Милдред бормочет cowphabet опять и опять. Фермер Нхой
хочет узнать, сколько раз она пробормотала cowphabet.
По заданной строке букв, которые услышал ФН, вычислите минимальное
количество раз, которое Милдред пробормотала весь cowphabet. ФН мог не услышать
некоторые из букв, которые бормотала Милдред.
Замечание: время на тест для этой задачи удвоено.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Единственная строка ввода содержит строку маленьких букв, которые услышал ФН.
Эта строка имеет длину от \(1\) до \(10^5\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите минимальное количество раз, которое Милдред произнесла весь cowphabet.
| |
|
|
Closest Cow Wins
Жадный алгоритм
У Фермера Джона длинная ферма вдоль скоростной дороги, которую можно рассматривать
как числовую прямую. Вдоль фермы имеется \(K\) травяных пастбищ \(1 \leq K \leq 2\cdot 10^5\));
\(i\)-ое пастбище расположено в позиции \(p_i\) и имеет величину вкусности \(t_i\) (\(0\le t_i\le 10^9\)).
Фермер Нхой уже расположил свои \(M\) коров (\(1 \leq M \leq 2\cdot 10^5\)) в позициях
\(f_1 \ldots f_M\). Все \(K+M\) этих чисел различны и находятся в интервале \([0,10^9]\).
ФД хочет выбрать \(N\) (\(1\le N\le 2\cdot 10^5\)) (не обязательно в целых числах)
для размещения своих коров. Эти числа должны отличаться от позиций занимаемых коровами ФН,
но они могут находится в позициях травяных пастбищ.
Корова какого фермера находится ближе к травяному пастбищу, тот и объявляется
собственником этого пастбища. Если коровы обоих фремеров находятся на одинаковом
расстоянии от пастбища, то оно объявляется принадлежащим ФН.
По заданным позициям коров ФН и вкусностям пастбищ определите максимальную
вкусность суммарную, которой может добиться ФД оптимальным размещением своих коров.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка содержит \(K\), \(M\), \(N\).
Каждая из последующих \(K\) строк содержит два разделённых пробелом целых числа
\(p_i\) и \(t_i\).
Каждая из последующих \(M\) строк содержит \(f_i\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Одно целое число, максимальную суммарную вкусность. заметим, что ответ может
превысить 32-битное целое число, поэтому нужно использовать 64-битное, например
long long в С++.
| |
|
|
Lonely Photo
Жадный алгоритм
Фермер Джон недавно закупил \(N\) коров \((3 \le N \le 5 \times 10^5)\), каждая
из которых имеет породу Guernsey или Holstein.
Эти коровы сейчас стоят в ряд и ФД хочет сделать фото каждой последовательности
из трёх или более последовательных коров. Однако он не хочет делать фото, в котором
ровно одна корова породы Guernsey или ровно одна корова породы Holstein --- он считает,
что эта одна корова будет чувствовать себя изолированной. После взятия фото каждой
последовательности из трёх или более коров, он выбрасывает так называемые "одинокие"
фото, на которых ровно одна корова породы Guernsey или ровно одна корова породы Holstein.
По заданному порядку коров, помогите ФД определить, сколько "одиноких" фото он выбросит.
Два фото считаются различными, если они начинаются или заканчиваются на различных коровах в
ряду.
Формат ввода (с клавиатуры / stdin):
Первая строка ввода содержит \(N\).
Вторая строка содержит строку из \(N\) символов. \(i\)-ый символ есть G
если соответствующая корова имеет породу Guernsey, и H, если соответствующая корова
имеет породу Holstein.
Формат вывода (на экран / stdout):
Выведите количество фотографий, которые ФД выбросит.
| |
|
|
Air Cownditioning
Жадный алгоритм
\(N\) коров очень чувствительны к температуре в амбаре. Некоторые любят температуру
похолоднее, а другие - потеплее.
Амабар Фермера Джона содержит последовательность из \(N\) стойл, пронумерованных
\(1 \ldots N\), каждое содержит ровно одну корову. \(i\)-ая корова предпочитает, чтобы
температура в её стойле была \(p_i\), а прямо сейчас температура в её стойле \(t_i\).
Для того чтобы угодить всем коровам, ФД установил новую систему кондиционирования,
которая работает следующим образом. ФД посылает команды системе - увеличить или
уменьшить температуру в некоторых подряд идущих стойлах на 1 (например, увеличить
на 1 температуру в стойлах \(5 \ldots 8\)). Последовательность стойл может состоять
из одного стойла.
Помогите ФД определить минимальное количество команд, которые должен применить
ФД, чтобы сделать желаемой температуру в стойле для каждой коровы.
ФОРМАТ ВВОДА (с клавиатуры / stdin):
Первая строка ввода содержит \(N\). Следующая строка содержит \(N\) неотрицательных
целых чисел \(p_1 \ldots p_N\), разделённых одиночными пробелами. Финальная строка
содержит \(N\) неотрицательных целых чисел \(t_1 \ldots t_N\).
ФОРМАТ ВЫВОДА (на экран / stdout):
Выведите одно целое число - минимальное количество команд, которое может
использовать ФД.
| |
|
|
Berry Picking
Жадный алгоритм
Беси и её маленькая сестра Эльза собирают ягоды в саду Фермера Джона.
В саду ФД имеется ровно \(N\) деревьев с ягодами (\(1\le N\le 1000\));
На дереве \(i\) висит ровно \(B_i\) ягод (\(1\le B_i\le 1000\)). У Беси
есть ровно \(K\) корзин (\(1 \le K \le 1000\), \(K\) - чётное).
Каждая корзина может содержать сколько Беси хочет ягод с одного дерева,
но не может содержать ягоды с двух различных деревьев (поскольку вкусы
ягод отрицательно влияют друг на друга). Корзины могут оставаться
пустыми.
Беси хочет максимизировать количество ягод, которое она соберёт.
Однако ФД хочет, чтоб Беси поделилась ягодами со своей младшей сестрой,
поэтому Беси должна отдать Эльзе \(K/2\) корзин с наибольшим количеством ягод.
Это значит, что у Эльзы может даже оказаться больше ягод чем у Беси.
Помогите Беси вычислить максимальное количество ягод, которое она может
получить после делёжки.
SCORING:
- Тесты 1-4 удовлетворяют условию \(K\le 10.\)
- Тесты 5-11 не имеют дополнительных ограничений.
ФОРМАТ ВВОДА (файл berries.in):
Первая строка ввода содержит два разделённых пробелом целых числа \(N\) и \(K\).
Вторая строка содержит \(N\) разделённых одиночными пробелами целых чисел
\(B_1,B_2,\ldots,B_N.\)
ФОРМАТ ВЫВОДА (файл berries.out):
Одна строка с ответом.
| |
|
|
Race
Жадный алгоритм
Беси участвует в гонке длиной \(K\) (\(1\le K\le 10^9\)) метров. Она начинает бежать
со скоростью 0 метров в секунду. Каждую секунду она может увеличить свою скорость
на 1 метр в секунду, оставить скорость неизменной или уменьшить скорость на 1
метр в секунду. Например, в первую секунду она может увеличить скорость на 1 метр
в секунду и пробежать за эту секунду 1 метр, или оставить скорость - метров в
секунду и пробежать 0 метров. Беси не может сделать свою скорость меньше нуля.
Беси всегда бежит к финишу и хочет финишировать после целого количества
секунд. Кроме того, она не хочет прибежать слишком быстро, поэтому на финише
её скорость не может превысить \(X\) (\(1 \leq X \leq 10^5\)) метров в секунду.
Беси хочет узнать, как быстро она сможет закончить гонку для \(N\) (\(1 \leq N \leq 1000\))
различных величин \(X\).
ОЦЕНИВАНИЕ:
- Тесты 2-4 удовлетворяют \(N=X=1.\)
- тесты 5-10 не имеют дополнительных ограничений.
ФОРМАТ ВВОДА (файл race.in):
Первая строка содержит два целых числа \(K\) и \(N\).
Каждая из следующих \(N\) строк содержит одно целое число \(X\).
ФОРМАТ ВЫВОДА (файл race.out):
Выведите \(N\) строк, каждая из них должна содержать одно целое число -
минимальное количество времени, которое требуется Беси, чтобы пробежать
\(K\) метров и финишировать со скоростью меньше либо равной \(X\).
| |
|
|
Help Yourself
Жадный алгоритм
Беси дали \(N\) отрезков (\(1\le N\le 10^5\))и одну прямую. \(i\)-ый отрезок
содержит все вещественные числа \(x\) такие, что \(l_i\le x\le r_i\).
Определите объединение отрезов, которое будет множеством всех
\(x\) которые содержатся внутри хотя бы одного отрезка.
также определите сложность множества отрезков
как количество связанных отрезков, представленных в этом объединении.
Беси хочет вычислить сумму сложностей во всем \(2^N\) подмножествам заданного
множества из \(N\) отрезков по модулю \(10^9+7\).
Помогите Беси!
ОЦЕНИВАНИЕ:
- В тестах 2-3 \(N\le 16\).
- В тестах 4-7 \(N\le 1000\).
- В тестах 8-12 нет дополнительных ограничений.
ФОРМАТ ВВОДА (файл help.in):
Первая строка содержит \(N\).
Каждая из следующих \(N\) строк содержит по два целых числа \(l_i\) и \(r_i\).
Гарантируется, что \(l_i< r_i\) и все \(l_i,r_i\) различные целые числа в интервале
\(1 \ldots 2N.\)
ФОРМАТ ВЫВОДА (файл help.out):
Выведите ответ по модулю \(10^9+7\).
| |
|
|
Balancing Inversions
Жадный алгоритм
Префиксные суммы(минимумы, ...)
Беси и Эльза играют на битовом массиве \(A\) длиной \(2N\)
(\(1 \leq N \leq 10^5\)). Счёт Беси - это количество инверсий в первой половине
массива \(A\), а счёт Эльзы - количество инверсий во второй половине массива \(A\).
Инверсия - это такая пара \(A[i]=1\) и \(A[j]=0\), что \(i<j\).
Например, если массив состоит из блока 0, за которым следует блок 1, то инверсий нет.
А массив в котором за блоком из \(X\) единиц следует блок из \(Y\) нулей, то имеется
\(XY\) инверсий.
Фермер Джон остановился около игры и хочет узнать минимальное количество
обменов между соседними элементами, которые нужно совершить, чтобы игра получила
ничейный счёт.
ФОРМАТ ВВОДА (файл balance.in):
Первая строка ввода содержит \(N\), следующая строка содержит \(2N\) целых чисел каждое из
которых равно 0 или 1.
ФОРМАТ ВЫВОДА (файл balance.out):
Выведите количество соседних обменов, которые нужно сделать,
чтобы игра получила ничейный счёт.
| |
|
|
Sleepy Cow Sorting
Жадный алгоритм
Использование сортировки
реализация
Фермер Джон пытается отсортировать свои \(N\) коров (\(1 \leq N \leq 100\)),
последовательно пронумерованных \(1 \dots N\).
В настоящий момент коровы выстроились в линию в порядке
\(p_1, p_2, p_3, \dots, p_N\), и ФД стоит перед коровой \(p_1\).
Он хочет переупорядочить коров так, чтобы они стали в порядке
\(1, 2, 3, \dots, N\), с коровой \(1\) перед ФД.
Фермера Джона слышит только корова, которая стоит перед ним.
В этот момент ФД может сказать ей перейти на \(k\) позиций назад
(\(k\) в интервале \(1 \ldots N-1\).). \(k\) коров, которых она проходит,
двигаются вперёд, освобождая место для неё, в которое она и
становится.
Например, пусть \(N=4\) и коровы стоят в таком порядке
ФД: 4, 3, 2, 1
Единственная корова, которая слышит ФД, это корова \(4\).
Если он скажет ей сдвинуться на 2 позиции, порядок станет таким:
ФД: 3, 2, 4, 1
Теперь ФД слышит только корова \(3\). Теперь ей можно давать инструкцию и т.д.
Определите последовательность инструкций (с минимальным их количеством),
которые должен дать ФД, чтобы отсортировать всех коров.
ФОРМАТ ВВОДА (файл sleepy.in):
Первая строка содержит \(N\). Вторая строка содержит \(N\) целых чисел,
разделённых одиночными пробелами : \(p_1, p_2, p_3, \dots, p_N\),
указывающих стартовый порядок коров.
ФОРМАТ ВЫВОДА (файл sleepy.out):
Первая строка должна содержать одно целое число \(K\), задающее минимальное
количество инструкций, которое требуется, чтобы отсортировать всех коров.
Вторая строка должна содержать \(K\) разделённых одиночными пробелами
целых чисел \(c_1, c_2, \dots, c_K\), каждое в интервале \(1 \ldots N-1\),
задающих последовательность инструкций, которая отсортирует исходную
последовательность коров.
Если имеется несколько оптимальных последовательностей инструкций,
выведите любую.
| |
|
|
Sleepy Cow Herding
Жадный алгоритм
Отрезки
Задача на реализацию
\(N\) коров Фермера Джона бродят далеко от фермы. Ваша задача - собрать
их в стадо.
Главное поле фермы представлено прямой, на которой каждая корова занимает
некоторое положение в целочисленной координате. Изначально все \(N\) коров
находятся в различных позициях. ФД хочет, чтобы они заняли соседние позиции
(например 3,4,5,6,7,8).
В любой момент времени ФД может давать команду только одной из двух
"крайних" коров (находящейся или в минимальной или в максимальной позиции
среди всех коров). Когда ФД перемещает корову, он говорит ей перейти на любую
незанятую позицию, так чтобы эта корова перестала быть крайней.
Такие перемещения "сближают" коров вплоть до нужного результата.
Определите минимальное и максимальное количество таких перемещений,
чтобы коровы заняли \(N\) последовательных позиций.
ФОРМАТ ВВОДА (файл herding.in):
Первая строка ввода содержит \(N\) (\(3 \leq N \leq 10^5\)). Каждая из следующих
\(N\) строк содержит целое число (в интервале \(1 \ldots 10^9\)) - местоположение
коровы.
ФОРМАТ ВЫВОДА (файл herding.out):
Первая строка вывода должна содержать минимальное количество перемещений,
которое должен сделать ФД, чтобы сгруппировать своих коров.
Вторая строка вывода должна содержать максимальное количество перемещений,
которое должен сделать ФД, чтобы сгруппировать своих коров.
| |
|
|
Cow Dating
Жадный алгоритм
Фермер Джон сделал новый сайт для коров и быков.
Беси решила воспользоваться им для поиска партнёра. Он создала аккаунт и
получила список из \(N\) возможных соответствий (\(1\leq N \leq 10^6\)).
Беси оценила, что каждый бык имеет вероятность \(p_i\) (\(0<p_i<1\))
согласиться на её приглашение на танец.
Беси решила послать приглашение каждому быку в некотором непрерывном интервале
списка, но так, чтобы получить ровно одного партнёра. Помогите Беси определить
максимальную вероятность получить ровно одно принятое приглашение,
выбрав правильный интервал.
Формат входных данных:
Первая строка ввода содержит \(N\) ( \(1 \leq N \leq 10^6\)). Каждая из оставшихся
строк содержит \(10^6\) умноженное на \(p_i\), что является целым числом.
Как минимум для 25% тестов гарантировано \(N \leq 4000\).
ФОРМАТ ВЫВОДА (файл cowdate.out):
Выведите умноженную на \(10^6\) вероятность получить ровно одно принятое приглашение
округлённую вниз до ближайшего целого числа.
| |
|
|
The Great Revegetation
Жадный алгоритм
Длительная засуха лишила травы \(N\) пастбищ Фермера Джона.
Однако с приближением сезона дождей пришло время восстановить траву
на пастбищах.
В сарае ФД есть четыре ведра, каждое хранит семена своего типа.
ФД хочет посадить на каждом пастбище траву семенами одного из этих типов.
ФД хочет каждой их своей коров различную диету. Каждая из его \(M\) коров
имеет два любимых пастбища. И он хочет гарантировать, чтобы на каждой
такой паре пастбищ была засеяна трава различных типов, и тогда каждая
корова сможет выбирать из двух видов травы. ФД знает, что нет пастбища,
которое нравится более чем трём коровам.
Помогите ФД выбрать тип травы для каждого пастбища так, чтобы запросы
по питанию всех коровы были удовлетворены.
ФОРМАТ ВВОДА (файл revegetate.in):
Первая строка ввода содержит \(N\) (\(2 \leq N \leq 100\)) и \(M\)
(\(1 \leq M \leq 150\)).
Каждая из последующих \(M\) строк содержит два целых числа в интервале
\(1 \ldots N\), описывающих пару любимых пастбищ соответствующей коровы.
ФОРМАТ ВЫВОДА (файл revegetate.out):
Выведите число из N цифр, каждая цифра которого в интервале \(1 \ldots 4\),
описывающее тип травы, которую нужно посадить на соответствующем пастбище.
Первая цифра описывает тип травы на пастбище 1, вторая - на пастбище 2 и т.д.
Если возможно несколько решений, выведите такое, что соответствующее число из
\(N\) цифр минимальное.
| |
|
|
Sleepy Cow Herding
Жадный алгоритм
Разбор случаев
Задачи на моделирование
Три лучшие коровы Фермера Джона Беси, Эльза и Милдред всегда уходят далеко от фермы.
Помогите ФД "сгрудить их в стадо".
Главное поле фермы можно представить в виде числовой прямой, и каждая
корова находится в целочисленной координате. Все три координаты различны.
ФД хочет переместить их так, чтобы они заняли последовательные координаты
(например, 6,7,8).
В любой момент времени ФД может заставить корову двигаться только, если
она находится в "конечной" точке (минимальной или максимальной позиции
среди всех коров). Когда он перемещает корову, он говорит ей двигаться
на любую незанятую целую позицию, так чтобы она перестала быть в конечной точке.
С течением времени такие передвижения обеспечивают сближение коров.
Определите минимальное и максимальное количество перемещений, которое возможно
сделать прежде чем коровы расположатся в трёх последовательных позициях.
ФОРМАТ ВВОДА (файл herding.in):
Входной файл содержит одну строку с тремя разделёнными пробелами целыми
числами, определяющими координаты Беси, Эльзы и Милдред. Каждая координата
- целое число в интервале \(1 \ldots 10^9\).
ФОРМАТ ВЫВОДА (файл herding.out):
Первая строка вывода должна содержать минимальное количество перемещений,
которое должен сделать ФД, чтобы сгруппировать коров. Вторая строка должна
содержать максимальное количество перемещений, которое может сделать ФД
прежде чем коровы окажутся на последовательных позициях.
| |
|
|
Lemonade Line
Жадный алгоритм
Сегодня на ферме жаркий летний день и Фермер Джон развозит лимонад своим
\(N\) коровам. Все \(N\) коров (последовательно пронумерованных \(1 \dots N\))
любят лимонад, но некоторые из них любят больше чем другие. В частности,
корова \(i\) готова подождать не более \(w_i\) коров прежде чем получит свой
лимонад. Прямо сейчас все \(N\) коров на полях, но вскоре ФД позвонит в колокол
и коровы побегут к нему. Все прибудут до того, как он начнёт раздавать
лимонад, но никакие две коровы не прибудут в одно и то же время.
Более того, когда корова \(i\) прибывает, она становится в очередь
если и только если в очереди находится не более \(w_i\) коров.
ФД хочет подготовить заранее некоторое количество лимонада, но он не хочет
быть нерасчётливым. Количество коров, которые станут в очередь зависит от
порядка, в котором они прибывают. Помогите ему определить минимальное
количество коров, которые станут в очередь.
ФОРМАТ ВВОДА (файл lemonade.in):
Первая строка ввода содержит \(N\), вторая строка содержит \(N\) разделённых
пробелом целых чисел \(w_1, w_2, \dots, w_N\). Гарантируется, что
\(1 \leq N \leq 10^5\), и \(0 \leq w_i \leq 10^9\) для каждой коровы \(i\).
ФОРМАТ ВЫВОДА (файл lemonade.out):
Выведите минимальное количество коров, которые могут стать в очередь,
среди всех возможных порядков прибытия коров.
| |
|
|
Rental Service
Жадный алгоритм
Использование сортировки
Задачи на моделирование
Чтобы увеличить свой доход, Фермер Джон организовал сервис по аренде коров.
У ФД есть \(N\) коров (\(1 \leq N \leq 100,000\)), каждая способна производить
некоторое количество молока каждый день. \(M\) магазинов (\(1 \leq M \leq 100,000\))
недалеко от фермы Джона покупают определённое количество молока, каждый по своей
цене. Более того, \(R\) (\(1 \leq R \leq 100,000\)) соседних фермеров заинтересованы
в аренде коров по некоторой цене.
ФД должен выбрать для каждой коровы, доить её самому или отдать в аренду
соседнему фермеру. Помогите ФД определить максимальное количество денег,
которое он может заработать за один день.
ФОРМАТ ВВОДА (файл rental.in):
Первая строка ввода содержит \(N\), \(M\), \(R\). Каждая из следующих \(N\) строк
содержит целое число \(c_i\) (\(1 \leq c_i \leq 1,000,000\)), указывающее, что
\(i\)-ая корова ФД может произвести \(c_i\) галлонов молока в день. Каждая
из \(M\) строк содержит два целых числа \(q_i\) и \(p_i\) (\(1 \leq q_i, p_i \leq 1,000,000\)),
которые обозначают, что \(i\)-ый магазин готов купить \(q_i\) галлонов молока
по \(p_i\) центов за галлон. Имейте ввиду, что ФД может продавать любое количество
молока от 0 до \(q_i\) галлонов в этот магазин. Каждая из следующих \(R\) строк
содержит целое число \(r_i\) (\(1 \leq r_i \leq 1,000,000\)), означающее, что один
из соседей ФД хочет арендовать корову за \(r_i\) центов в день.
ФОРМАТ ВЫВОДА (файл rental.out):
Вывод должен содержать одну строку - максимальную прибыль ФД, которую он может
получить за один день, доя или сдавая в аренду каждую из своих коров.
Заметим, что ответ может оказаться большим, чтобы поместиться в 32-битное целое,
поэтому Вы должны использовать тип как "long long" в C/C++.
| |
|
|
Lifeguards
Жадный алгоритм
Фермер Джон открыл бассейн для своих коров, чтобы они там отдыхали и потом
давали больше молока.
Чтобы обеспечить безопасность, он нанял \(N\) коров спасателями, каждый из
которых работает в течение некоторого интервала времени в течение дня.
Для простоты, бассейн открыт с момента времени \(t=0\) до момента времени \(10^9\)
каждый день. Поэтому каждый интервал может быть описан двумя целыми числами
- временем начала и конца работы спасателя. Например, спасатель, начинающий в
момент времени \(t = 4\) и завершающий в момент времени \(t = 7\), покрывает
интервал в три единицы времени.
К несчастью, ФД нанял на \(K\) спасателей больше чем может платить зарплату.
При условии, что он должен уволить ровно \(K\) спасателей, какой максимальный интервал
времени, будет покрыт оставшимися спасателями? Интервал времени покрыт, если
присутствует хоть один спасатель в это время.
ФОРМАТ ВВОДА (файл lifeguards.in):
Первая строка ввода содержит два числа \(N\) и \(K\)
(\(K \leq N \leq 100,000, 1 \leq K \leq 100\)). Каждая из последующих
\(N\) строк описывает интервалы работы спасателей двумя целыми числами в интервале
\(0 \ldots 10^9\), задающими начало и конец работы спасателя. Все числа концы
интервалов - различны. Сами интервалы могут перекрываться.
ФОРМАТ ВЫВОДА (файл lifeguards.out):
Выведите одно целое число - максимальное количество времени, которое останется
покрытым, если ФД уволит \(K\) спасателей.
| |
|
|
Cow at Large
графы
Деревья
Жадный алгоритм
Беси попала на дальнюю ферму.
Эта ферма состоит из \(N\) амбаров (\(2 \leq N \leq 7 \cdot 10^4\)) и \(N-1\) двунаправленных
туннелей между амбарами, так что между любыми двумя амбарами имеется путь, и он
единственный. Каждый амбар, который имеет только один туннель, является выходом.
Когда придёт утро, Беси приземлится на некоторый амбар и попытается достичь выхода.
Но в тот момент, когда Беси приземляется, закон сможет определить ее местоположение.
Некоторые фермеры начнут в различных выходных амбарах и попытаются поймать Беси.
Фермеры двигаются на той же скорости, что и Беси (поэтому в каждый момент времени
каждый фермер может перейти из своего амбара в соседний). Фермеры всё время знают,
где находится Беси, и Беси всё время знает, где находятся фермеры. Фермеры поймают
Беси, если в некоторый момент времени, один из фермеров находится в том же амбаре,
что и Беси или проходит по тому же туннелю, что и Беси. Беси сбежит, если
достигнет амбара с выходом, прежде чем любой из фермеров поймает её.
Беси не уверена в своих шансах на успех, которые зависят от количества
фермеров, которые будут за ней охотиться. Для каждого из \(N\) амбаров, в
которых может приземлиться Беси, определите минимальное количество фермеров, которое
необходимо, чтобы поймать Беси, в предположении, что фермеры распределяться
оптимально среди выходных амбаров.
ФОРМАТ ВЫВОДА (файл atlarge.in):
Первая строка ввода содержит \(N\). Каждая из последующих \(N-1\) строк
содержит два целых числа в интервале \(1 \ldots N\), описывающих туннель
между двумя амбарами.
Заметим время на тест в этой задаче больше чем по умолчанию:
4 секунды для C/C++/Pascal, и 8 секунд для Java/Python.
ФОРМАТ ВЫВОДА (файл atlarge.out):
Выведите \(N\) строк, где \(i\)-ая строка содержит минимальное количество фермеров,
необходимых, чтобы поймать Беси, если она приземлится в амбаре \(i\).
| |
|
|
Snow Boots
Жадный алгоритм
На ферме зима и значит много снега! Имеется \(N\) фрагментов на дорожке от фермы
к амбару, последовательно пронумерованных \(1 \dots N\), и фрагмент \(i\) покрыт
\(f_i\) футами снега.
Фермер Джон начинает с фрагмента \(1\) и должен достичь фрагмента \(N\), чтобы
разбудить своих коров. Фрагмент \(1\) защищён крышей фермы, а фрагмент \(N\)
- крышей амбара, поэтому на них нет снега. Но чтобы ходить по другим фрагментам
ФД должен носить ботинки.
У ФД есть \(B\) пар ботинок, пронумерованных \(1 \dots B\). Некоторые из них тяжёлые,
а некоторые полегче. В частности, пара \(i\) позволяет ФД ходить по снегу не более
\(s_i\) футов глубины и позволяет ФД продвигаться на расстояние \(d_i\) вперёд на
каждом шагу.
К несчастью, ботинки упакованы таким образом, что ФД может взять только самую
верхнюю пару в любой момент времени. Поэтому в любой момент времени ФД может
или положить наверх пару ботов (отказываясь от старых ботов) или снять верхнюю
пару ботов, делая новую пару доступной).
ФД может менять ботинки только когда стоит на фрагменте. Если он стоит на
фрагменте, то и те ботинки, которые он снимает, и те ботинки, которые он надевает,
должны быть выше снега, как минимум на \(f\) футов. Промежуточные пары ботинок,
которые он снимает из стопки ботинок не одевая, могут не удовлетворять этому
ограничению.
Помогите ФД минимизировать отбросы, определив минимальное количество пар
ботов, которые он должен снять из стопки не одевая, чтобы достичь амбара.
Вы можете считать, что изначально на ФД нет никаких ботинок.
ФОРМАТ ВВОДА (файл snowboots.in):
Первая строка ввода содержит два разделённых пробелом целых числа \(N\) и \(B\)
( \(2 \leq N,B \leq 250\)).
Вторая строка содержит \(N\) целых чисел, разделённых одиночными пробелами.
\(i\)-ое число есть \(f_i\), глубина снега на фрагменте \(i\) (\(0 \leq f_i \leq 10^9\)).
Гарантируется, что \(f_1 = f_N = 0\).
Следующие \(B\) строк содержат по два разделённых пробелом целых числа.
Первое целое число на строке \(i+2\) есть \(s_i\) - максимальная глубина снега,
в который может ступить пара \(i\). Второе целое число на строке \(i+2\) есть \(d_i\),
максимальный размер шага для пары \(i\).
Гарантируется, что \(0 \leq s_i \leq 10^9\) и \(1 \leq d_i \leq N-1\).
Ботинки описываются в порядке сверху-вниз, потому пара \(1\) - самая верхняя
пара в пакете ботинок и т.д.
ФОРМАТ ВЫВОДА (файл snowboots.out):
Вывод должен состоять из одного целого числа, задающего минимальное количество
па ботинок, которые ФД должен отставить. Гарантируется, что ФД всегда может дойти
до амбара.
| |
|
|
Rest Stops
Жадный алгоритм
Фермер Джон и его персональный тренер Беси подымаются на гору Ванкувера.
Эта гора может быть представлена как тропинка длиной \(L\) метров
(\(1 \leq L \leq 10^6\)). ФД двигается по ней со скоростью \(r_F\) секунд в метр
(\(1 \leq r_F \leq 10^6\)). Он не делает остановок во время движения.
Беси, однако разрешено делать остановки для отдыха и поедания травы.
Но она может их делать не везде. Имеется \(N\) мест для остановок на тропинке
(\(1 \leq N \leq 10^5\)); \(i\)-ая остановка находится на \(x_i\) метров от начала
тропинки (\(0 < x_i < L\)), а трава на ней имеет вкусность \(c_i\)
(\(1 \leq c_i \leq 10^6\)). Если Беси остановится в месте \(i\) на \(t\) секунд,
она получит \(c_i \cdot t\) вкусности травы.
Беси двигается со скоростью \(r_B\) секунд за метр (\(1 \leq r_B \leq 10^6\)).
Поскольку Беси моложе, \(r_B\) строго меньше \(r_F\).
Беси хочет максимизировать потребление вкусной травы. Но она беспокоится о ФД.
Она думает, что если окажется позади ФД, у него пропадёт мотивация продолжать
движение.
Помогите Беси найти максимальное суммарное значение съеденной вкусной травы
которое она может получить, в уверенности, что ФД завершит подъём.
ФОРМАТ ВВОДА (файл reststops.in):
Первая строка ввода содержит четыре целых числа: \(L\), \(N\), \(r_F\), \(r_B\).
Следующие \(N\) строк описывают остановки. Для каждого \(i\) от \(1\) до \(N\),
\(i+1\)-ая строка содержит два целых числа \(x_i\) и \(c_i\), описывающих позицию
\(i\)-ой остановки и вкусность травы здесь.
Гарантируется, что \(r_F > r_B\), и \(0 < x_1 < \dots < x_N < L \).
Заметим, что \(r_F\) и \(r_B\) задаются в секундах на метр!
ФОРМАТ ВЫВОДА (файл reststops.out):
Одно целое число: максимальное количество единиц вкусности, которое Беси может
получить.
| |
|
|
Taming the Herd
Жадный алгоритм
Динамическое программирование: один параметр
Разбор случаев
Однажды утром Фермер Джон проснулся от звуков дробления древесины.
Это коровы ломали амбар.
ФД рассердился. Он приделал к стене счётчик дней с последнего слома.
Если слом случился утром, счётчик покажет 0. Если последний слом случился 3
дня назад, счётчик показывает 3. ФД тщательно записывал значение счётчика
каждый день.
В конце года ФД решил действовать. Однако с логом некоторые проблемы.
ФД хочет определить, сколько слово зафиксировано. Однако он подозревает,
что коровы подделали его лог и всё в чём он уверен, что он начало лог в день
слома. Помогите ему определить, для каждого количества сломов какое минимальное
количество записей должно быть подделано.
ФОРМАТ ВВОДА (файл taming.in):
Первая строка ввода содержит одно целое число \(N\) ( \(1 \leq N \leq 100\)),
обозначающее количество дней, с дня когда ФД начал логгирование.
Вторая строка содержит \(N\) целых чисел, разделённых одиночными пробелами.
\(i\)-ое число это неотрицательное целое \(a_i\) (не более 100), указывающее
что в день \(i\) на счётчике было \(a_i\) если коровы не подделали эту запись в логе.
ФОРМАТ ВЫВОДА (файл taming.out):
Вывод состоит из \(N\) целых чисел, по одному в строке. \(i\)-ое целое число
должно содержать минимум из всех возможных последовательностей с \(i\) сломами
количества записей, которые несостоятельны в этой последовательности.
| |
|
|
Convention
Бинарный поиск по ответу
Использование сортировки
Жадный алгоритм
На ферме Джона состоится съезд по поеданию травы.
Коровы со всего мира прибывают в местный аэропорт, чтобы посетить съезд
и поесть траву. А именно \(N\) (\(1 \leq N \leq 10^5\)) коров прибывают в
аэропорт, и корова \(i\) прибывает в момент времени \(t_i\) (\(0 \leq t_i \leq 10^9\)).
ФД организовал \(M\) (\(1 \leq M \leq 10^5\)) автобусов для транспортировки коров
из аэропорта. Каждый автобус может вместить до \(C\) (\(1 \leq C \leq N\)) коров.
ФД ждёт вместе с автобусами в аэропорту и собирается распределить прибывающих
коров по автобусам. Автобус убывает из аэропорта в момент, когда прибывает
последняя корова. ФД хочет, чтобы прибывающие коровы не ждали в аэропорту
слишком долго. Каково наименьшее значение максимального времени ожидания
из всех коров, если ФД оптимально назначит их по автобусам.
Время ожидания коровы есть разность между временем её прибытия и временем
отправления автобуса, в который она распределена.
Гарантируется, что \(MC \geq N\).
ФОРМАТ ВВОДА (файл convention.in):
Первая строка содержит три разделённых одиночными пробелами целых числа
\(N\), \(M\), \(C\). Следующая строка содержит \(N\) разделённых одиночными пробелами
целых чисел, представляющих время прибытия каждой коровы.
ФОРМАТ ВЫВОДА (файл convention.out):
Выведите одну строку, содержащую оптимальное минимальное максимальное время
ожидания для любой из прибывающих коров.
| |
|
|
Sort It Out
Жадный алгоритм
реализация
разделяй и властвуй
\(N\) (\(1 \leq N \leq 10^5\)) Є®а®ў ”Ґа¬Ґа „¦® (а §«Ёз® Ё¤ҐвЁдЁжЁа®ў ле
\(1 \ldots N\)), ўлбва®Ґл ў ап¤. ”„ «оЎЁв, Є®Ј¤ ҐЈ® Є®а®ўл ўлбва®Ґл Ї® ў®§а бв Ёо,
® ᥩз б нв® Ґ в Є.
”„ ўл§лў Ґв Є®а®ўл Ї® ®¤®©. Љ®Ј¤ Є®а®ў ўл§ў , ® Їа®ўҐапҐв, Ґб«Ё Є®а®ў
ҐЇ®б।б⢥® бЇа ў ®в Ґс Ё¬ҐҐв ¬ҐмиЁ© ID, в®Ј¤ ®Ё ¬Ґповбп ¬Ґбв ¬Ё.
‡ ⥬, Ґб«Ё Є®а®ў ҐЇ®б।б⢥® б«Ґў ®в Ґс Ё¬ҐҐв Ў®«миЁ© ID, ®Ё ¬Ґповбп
¬Ґбв ¬Ё. Љ®а®ў ®бв ў«Ёў Ґвбп ў в®зЄҐ, Є®Ј¤ Є®а®ў б«Ґў ®в Ґс Ё¬ҐҐв
¬ҐмиЁ© ®¬Ґа, Є®а®ў бЇа ў ®в Ґс Ё¬ҐҐв Ў®«миЁ© ®¬Ґа.
”„ е®зҐв ўлЎа вм Ї®¤¬®¦Ґбвў® Є®а®ў, Ё § ⥬ Їа®ЁвҐаЁа®ў вмбп Ї® н⮬г
Ї®¤¬®¦Ґбвўг, ўл§лў п Є ¦¤го Ё§ нвЁе Є®а®ў Ї® ®зҐаҐ¤Ё (ў Ї®ап¤ЄҐ ў®§а бв Ёп Ёе ID),
®Їпвм Ё ®Їпвм ¤® вҐе Ї®а, Ї®Є ўбҐ Є®а®ўл Ґ бв гв ®вб®авЁа®ў л.
Ќ ЇаЁ¬Ґа, Ґб«Ё ® ўлЎҐаҐв Ї®¤¬®¦Ґбвў® Є®а®ў б ID \(\{2, 4, 5\}\), в® ® б з «
ўл§®ўҐв Є®а®ўг \(2\), § ⥬ Є®а®ўг \(4\), § ⥬ Є®а®ўг \(5\). …б«Ё ўбҐ \(N\) Є®а®ў Ґйс
Ґ ®вб®авЁа®ў л, ® Ўг¤Ґв ўл§лў вм нвЁе Є®а®ў ®Їпвм Ё ®Їпвм, бЄ®«мЄ® 㦮 а §.
”„ е®зҐв ¬ЁЁ¬Ё§Ёа®ў вм а §¬Ґа нв®Ј® ¬®¦Ґбвў . Ѓ®«ҐҐ в®Ј®, Ї®бЄ®«мЄг ®
бзЁв Ґв зЁб«® \(K\) бз бв«Ёўл¬, Ї®¬®ЈЁвҐ Ґ¬г ®ЇаҐ¤Ґ«Ёвм \(K\)-®Ґ «ҐЄбЁЄ®Ја дЁзҐбЄЁ
¬ЁЁ¬ «м®Ґ Ї®¤¬®¦Ґбвў® ¬ЁЁ¬ «м®Ј® а §¬Ґа в Є®Ґ, зв® ўл§лў п Ї®б«Ґ¤®ў ⥫м®
Є®а®ў нв®Ј® Ї®¤¬®¦Ґб⢠㦮Ґ Є®«ЁзҐбвў® а § ¬®¦® ®вб®авЁа®ў вм ўбҐе Є®а®ў.
Џ®¤¬®¦Ґбвў® \(S\) Ё§ \(\{1,\dots,N\}\) §лў Ґвбп «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬ҐмиҐ,
祬 Ї®¤¬®¦Ґбвў® \(T\) Ґб«Ё бЇЁб®Є н«Ґ¬Ґв®ў ў \(S\) (ў Ї®ап¤ЄҐ ў®§а бв Ёп)
«ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬ҐмиҐ, зҐ бЇЁб®Є н«Ґ¬Ґв®ў Ё§ \(T\) (ў Ї®ап¤ЄҐ ў®§а бв Ёп).
Ќ ЇаЁ¬Ґа, \(\{1, 3, 6\}\) «ҐЄбЁЄ®Ја дЁзҐбЄЁ ¬ҐмиҐ, 祬 \(\{1, 4, 5\}\).
ЋжҐЁў ЁҐ: ‚ вҐбв е \(3/16\) Ў ««®ў \(N \leq 6\) and \(K = 1\).
‚ ¤®Ї®«ЁвҐ«мле вҐбв е \(5/16\) Ў ««®ў, \(K = 1\).
‚ ¤®Ї®«ЁвҐ«мле вҐбв е \(8/16\) Ў ««®ў, Ґв ¤агЈЁе ®Ја ЁзҐЁ©.
”ЋђЊЂ’ ‚‚Ћ„Ђ (д ©« itout.in):
ЏҐаў п бва®Є ᮤҐа¦Ёв ®¤® 楫®Ґ зЁб«®, \(N\).
‚в®а п бва®Є ᮤҐа¦Ёв ®¤® 楫®Ґ зЁб«®, \(K\) ( \(1 \leq K \leq 10^{18}\)).
’аҐвмп бва®Є ᮤҐа¦Ёв \(N\) а §¤Ґ«сле ®¤Ё®зл¬Ё Їа®ЎҐ« ¬Ё 楫ле зЁбҐ«, ЇаҐ¤бв ў«пойЁе
ID Є®а®ў б«Ґў Їа ў®.
ѓ а вЁагҐвбп, Ўг¤Ґв Є Є ¬ЁЁ¬г¬ \(K\) Є®а४вле Ї®¤¬®¦Ґбвў.
”ЋђЊЂ’ ‚›‚Ћ„Ђ (д ©« itout.out):
ЏҐаў п бва®Є ўлў®¤ ᮤҐа¦Ёв а §¬Ґа ¬ЁЁ¬ «м®Ј® Ї®¤¬®¦Ґбвў .
Ћбв ўиЁҐбп бва®ЄЁ ¤®«¦л ᮤҐа¦ вм ID Є®а®ў ў \(K\)-®¬ «ҐЄбЁЄ®Ја дЁзҐбЄЁ
¬ЁЁ¬ «м®¬ Ї®¤¬®¦Ґб⢥ ¬ЁЁ¬ «м®Ј® а §¬Ґа ,Ї® ®¤®¬г ID ў бва®ЄҐ,
ў Ї®ап¤ЄҐ ў®§а бв Ёп.
Џђ€Њ…ђ ‚‚Ћ„Ђ:
4 1
4 2 1 3
Џђ€Њ…ђ ‚›‚Ћ„Ђ:
2
1
4
Њл зЁ Ґ¬ б ¬ ббЁў
\(\mathtt{\:4\:\; 2\:\; 1\:\; 3\:}\).
Џ®в®¬ ”„ ўл§лў Ґв Є®а®ўг б ID 1Ў Ї®«гзЁвбп ¬ ббЁў
\(\mathtt{\:1\:\; 4\:\; 2\:\; 3\:}\).
Џ®в®¬ ”„ ўл§лў Ґв Є®а®ўг б ID 4 Ї®«гзЁвбп ¬ ббЁў
\(\mathtt{\:1\:\; 2\:\; 3\:\; 4\:}\).
‚ нв®© в®зЄҐ ¬ ббЁў ®вб®авЁа®ў .
Problem credits: Spencer Compton
| |
|
|
Milk Measurement
Жадный алгоритм
Каждая из коров Фермера Джона изначально производит \(G\) галлонов молока в день
(\(1 \leq G \leq 10^9\)). Поскольку надой может варьироваться со временем, ФД
время от времени проводит измерения и и фиксирует их в следующем формате:
35 1234 -2
14 2345 +3
Первая строка означает, что в день 35 корова #1234 дала на 2 галлона меньше,
чем при последнем измерении. Следующая запись означает, что в день 14 корова
#2345 дала на 3 галлона молока больше, чем при последнем измерении. ФД каждый
день делает не более одного измерения. И записывает их необязательно в
хронологическом порядке.
Чтобы мотивировать коров, ФД отображает на стене карточки коров, которые
показывают наивысший надой. (если таких коров несколько, тогда на стене вывешиваются
карточки всех таких коров).
Определите количество дней, в которые ФД должен менять состав карточек.
Заметим, что у ФД огромное стадо коров, и хотя у некоторых из них делались замеры
изменения надоя, всегда имеются другие коровы, чей надой
остаётся \(G\) галлонов.
ФОРМАТ ВВОДА (файл measurement.in):
Первая строка ввода содержит количество измерений \(N\), которые сделал ФД
(\(1 \leq N \leq 100,000\)), за которым следует \(G\). Каждая из последующих \(N\) строк
содержит одно измерение в формате, описанном выше, указывая день(целое число в интервале
\(1 \ldots 10^6\)), целый ID коровы (в интервале \(1 \ldots 10^9\)) и изменение надоя
в последнем измерении (ненулевое целое число). Надой всегда будет
в интервале \(0 \ldots 10^9\).
ФОРМАТ ВЫВОДА (файл measurement.out):
Выведите количество дней, в которые ФД должен будет менять карточки на стене.
| |
|
|
Haybale Feast
"Два указателя"
Префиксные суммы(минимумы, ...)
Жадный алгоритм
Фермер Джон готовит деликатесную еду для своих коров. В его амбаре имеется \(N\)
стогов сена (\(1 \le N \le 100,000\)). \(i\)-ый стог имеет опредённый вкус \(F_i\)
(\(1 \le F_i \le 10^9\)) и определённую пряность \(S_i\) (\(1 \le S_i \le 10^9\)).
Еда будет представлять собой непрерывный интервал, содержащий один или более
последовательных стогов сена (нельзя менять их порядок). Общий вкус еды равен
сумме вкусов на интервале. Общая пряность еды - максимум из пряностей на интервале.
ФД хочет определить минимальную пряность, кторую можно достичь, чтобы
вкус был не менее \(M\) (\(1 \le M \le 10^{18}\)).
ФОРМАТ ВВОДА (файл hayfeast.in):
Первая строка содержит целые числа \(N\) и \(M\), количество стогов сена и минимальный
вкус, которого нужно достичь, соответственно. Следующие \(N\) строк описывают \(N\)
стогов сена парой чисел в строке - первое вкус \(F\), а второе - пряность \(S\).
ФОРМАТ ВЫВОДА (файл hayfeast.out):
Выведите минимальную пряность, которую можно достичь при выполнении требования
о минимальном вкусе. Гарантируется существование решеня.
| |
|
|
Landscaping
Жадный алгоритм
”Ґа¬Ґа „¦® бва®Ёв б ¤ Ё Ґ¬г вॡгҐвбп ЇҐаҐ¬ҐбвЁвм ¬®Ј® ¤са .
‘ ¤ б®бв®Ёв Ё§ Ї®б«Ґ¤®ў ⥫м®бвЁ Ё§ \(N\) Є«г¬Ў (\(1 \leq N \leq 100,000\)),
ѓ¤Ґ Є«г¬Ў \(i\) Ё§ з «м® б®¤Ґа¦Ёв \(A_i\) Ґ¤ЁЁж ¤са . ”„ е®зҐв ८࣠Ё§®ў вм б ¤ в Є, зв®Ўл Є ¦¤ п Є«г¬Ў бв « ᮤҐа¦ вм \(B_i\) Ґ¤ЁЁж ¤са . \(A_i\) Ё \(B_i\) - жҐ«лҐ зЁб« ў ЁвҐаў «Ґ \(0 \ldots 10\).
„«п Ё§¬ҐҐЁп « ¤и дв ”„ Ё¬ҐҐв ҐбЄ®«мЄ® ў аЁ в®ў: ® ¬®¦Ґв ЄгЇЁвм ®¤г Ґ¤ЁЁжг ¤са Ё Ї®«®¦Ёвм Ґс «оЎго Є«г¬Ўг § \(X\) Ґ¤ЁЁж ¤ҐҐЈ. Ћ ¬®¦Ґв бпвм ®¤г Ґ¤ЁЁжг ¤са б «оЎ®© Є«г¬Ўл Ё Їа®¤ вм Ґс § \(Y\) Ґ¤ЁЁж ¤ҐҐЈ. Ћ в Є¦Ґ ¬®¦Ґв
ЏҐаҐ¬ҐбвЁвм ®¤г Ґ¤ЁЁжг ¤са б Є«г¬Ўл \(i\) Є«г¬Ўг \(j\) § \(Z\) times \(|i-j|\).
‚лзЁб«ЁвҐ ¬ЁЁ¬ «мго бв®Ё¬®бвм, § Є®в®аго ”„ ¬®¦Ґв ўлЇ®«Ёвм бў®© Їа®ҐЄв.
”ЋђЊЂ’ ‚‚Ћ„Ђ (д ©« landscape.in):
ЏҐаў п бва®Є ўў®¤ ᮤҐа¦Ёв \(N\), \(X\), \(Y\), \(Z\) (\(0 \leq X, Y \le 10^8; 0 \le Z \leq 1000\)).
‘ва®Є \(i+1\) ᮤҐа¦Ёв жҐ«лҐ зЁб« \(A_i\) Ё \(B_i\).
”ЋђЊЂ’ ‚›‚Ћ„Ђ (д ©« landscape.out):
‚뢥¤ЁвҐ ¬ЁЁ¬ «мго б㬬 аго бв®Ё¬®бвм Їа®ўҐ¤ҐЁп а Ў®в.
Џђ€Њ…ђ ‚‚Ћ„Ђ:
4 100 200 1
1 4
2 3
3 2
4 0
Џђ€Њ…ђ ‚›‚Ћ„Ђ:
210
‡ ¬ҐвЁ¬ зв® в Є п § ¤ з ¤ ў « бм ў ®¤®¬ Ё§ ЇаҐ¦Ёе USACO-Є®вҐбв®ў га®ўҐ Silver. Ћ¤ Є® ᥩз б бгйҐб⢥® 㬥м襮 ўаҐ¬п вҐбв.
Ђўв®а: Brian Dean
Farmer John is building a nicely-landscaped garden, and needs to move a large
amount of dirt in the process.
The garden consists of a sequence of \(N\) flowerbeds (\(1 \leq N \leq 100,000\)),
where flowerbed \(i\) initially contains \(A_i\) units of dirt. Farmer John would
like to re-landscape the garden so that each flowerbed \(i\) instead contains
\(B_i\) units of dirt. The \(A_i\)'s and \(B_i\)'s are all integers in the range
\(0 \ldots 10\).
To landscape the garden, Farmer John has several options: he can purchase one
unit of dirt and place it in a flowerbed of his choice for \(X\) units of money.
He can remove one unit of dirt from a flowerbed of his choice and have it
shipped away for \(Y\) units of money. He can also transport one unit of dirt
from flowerbed \(i\) to flowerbed \(j\) at a cost of \(Z\) times \(|i-j|\). Please
compute the minimum total cost for Farmer John to complete his landscaping
project.
Формат входных данных:
The first line of input contains \(N\), \(X\), \(Y\), and \(Z\)
(\(0 \leq X, Y \le 10^8; 0 \le Z \leq 1000\)). Line \(i+1\) contains the integers \(A_i\) and \(B_i\).
Формат выходных данных:
Please print the minimum total cost FJ needs to spend on landscaping.
| |
|
|
Trapped in the Haybales (Silver)
Жадный алгоритм
Отрезки
реализация
Фермер Джон получил груз из \(N\) больших стогов сена
(\(1 \le N \le 100,000\)), и разместил стога в различных позициях вдоль дороги, соединяющей амбар с его домом. Каждый стог с номером \(j\) имеет размер \(S_j\) и находится в уникальной позиции \(P_j\) определяющей его положение вдоль одномерной дороги. Корова Беси расположена в настоящий момент в позиции \(B\),где нет стога сена.
Беси может передвигаться вдоль дороги вплоть до позиции, где расположен стог сена, но она не может проходить эту позицию. Как исключение, если она движется в некотором направлении \(D\) единиц расстояния, то она набирает скорость достаточную чтобы уничтожить любой стог сена с размером строго меньше, чем \(D\). Конечно после того как она сделает это, она может бежать дальше к другим стогам и уничтожать их аналогичным способом.
ФД перекрасил дои и амбар и хочет быть уверенным, что Беси не доберётся ни туда, ни туда (Корова и свежая краска не есть хорошая комбинация!). Соответственно, ФД хочет быть уверенным, что Беси никогда не выйдет ни за самый левый, ни за самый правый стог. ФД может добавить сена в один стог по своему выбору, так чтобы гарантировать, что Беси не выберется. Пожалуйста, помогите ему определить минимальное количество дополнительного размера, который он должен добавить к некоторому стогу сена, чтобы гарантировать, что Беси останется в ловушке.
ФОРМАТ ВВОДА (файл trapped.in):
Первая строка ввода содержит \(N\) и начальную позицию Беси \(B\).
Каждая из последующих \(N\) строк описывает стог и содержит два целых числа, определяющих его размер и местоположение. Все размеры и положения находятся в диапазоне \(1\ldots 10^9\).
ФОРМАТ ВЫВОДА (файл trapped.out):
Выведите одно целое число, определяющее минимальное количество сена, которое должен добавить ФД чтобы Беси не выбралась из ловушки. Выведите -1, если это сделать невозможно.
| |
|
|
Trapped in the Haybales (Gold)
Жадный алгоритм
Фермер Джон получили груз из N больших стогов сена
(\(1 \le N \le 100,000\)),
и разметил их в различных положениях вдоль дороги, ведущей к амбару.
К несчастью, он полностью забыл, что корова Беси пасётся вдоль дороги и может попасть в ловушку между стогами сена.
Каждый стог \(j\) имеет размер \(S_j\) и позицию \(P_j\)
определяющую его положение вдоль дороги. Беси может двигаться вдоль дороги вплоть до позиции стога, но не может пересечь эту позицию.
Исключение – если она прошла в этом направлении \(D\) единиц расстояния, тогда она набрала достаточно скорости, чтобы протаранить стог любого размера строго меньше чем \(D\). Конечно после этого она может продолжить движение и таранить другие стога.
Беси может выйти на свободу если она в конце концов протаранит протаранит самый левый или самый правый стог.
Вычислите общий размер участка дороги, состоящий из возможных точек старта Беси, из которых она не сможет выбраться.
ФОРМАТ ВООДА (ФАЙЛ trapped.in):
Первая строка ввода содержит \(N\). Каждая из последующих \(N\) строк описывает стог, и содержит два целых числа определяющих размер и позицию в диапазоне
\(1\ldots 10^9\). Все позиции различны.
ФОРМАТ ВЫВОДА (файл trapped.out):
Выведите одно целое число – размер области дороги, откуда Беси не сможет выбраться.
| |
|
|
Trapped in the Haybales (Bronze)
Жадный алгоритм
Фермер Джон получил груз из \(N\) больших стогов сена (\(1 \le N \le 4000\)) и разместил эти стога в различных точках дороги, ведущей к его амбару.
К несчастью, он совсем забыл, что Беси пасётся вдоль этой дороги и может оказаться в ловушке из этих стогов.
Каждый стог с номером \(j\) имеет размер \(S_j\) и уникальную позицию\(P_j\),
задающую его положение вдоль одномерной дороги. Беси начинает движение в некоторой позиции, где не было стога и может передвигаться свободно вдоль дороги, вплоть до позиции, где размещён стог сена, но она не может перейти эту позицию.
В качестве исключения, если она движется в некотором направлении
\(D\) единиц расстояния, она набирает достаточно скорости, чтобы протаранить любой стог сена с высотой строго меньше, чем \(D\). Конечно, после того, как она сделает это, перед ней открывается пространство с другими стогами сена, которые она тоже может протаранить.
Беси может выйти на свободу как после самого левого, так и после самого правого стога сена. Пожалуйста, определите общую длину дороги, состоящую из тех позиций, из которых Беси не сможет выбраться. Например, если Беси не может выбраться если она начинает с позиции между стогами в позициях 1 и 5, тогда ответ будет 4 (поскольку эти позиции ограничивают область размером 4).
ФОРМАТ ВВОДА (файл trapped.in):
Первая строка ввода содержит \(N\). Каждая из последующих \(N\) строк описывает стог и содержит два целых числа, определяющих его размер и позицию, каждое в диапазоне \(1\ldots 10^9\).
ФОРМАТ ВЫВОДА (файл trapped.out):
Выведите целое число, определяющее длину части дороги из которой Беси не сможет сбежать.
| |
|
|
Recording the Moolympics
Жадный алгоритм
Фермер Джон хочет записать как можно больше телетрансляций о Му-олимпийских играх. График трансляций состоит из N различных программ (1 <= N <= 150), для каждой из которых указано время начала и время конца. Видео-записывающий тюнер ФД может записывать две программы одновременно. Помогите ФД определить максимальное количество программ, которое он сможет записать. PROBLEM NAME: recording Формат входных данных * Строка 1: Целое число N. * Строки 2..1+N: Каждая строка содержит время начала и время завершения программы (целые числа в интервале 0..1,000,000,000)) Формат выходных данных * Строка 1: Максимальное количество программ, которое сможет записать ФД. Примечание ФД может записать не более 4 программ. Например, он может записать программы 1 и 3 на первом тюнере, И программы 2 и 4 на втором тюнере.
| |
|
|
Ski Course Design
Жадный алгоритм
У Фермера Джона на ферме N склонов (1 <= N <= 1,000), каждый с целое высотой в диапазоне от 0 до 100. Зимой, когда выпадает снег, ФД организует на них лыжный тренировочный лагерь. Однако сейчас ФД вычитал, что по новому закону придётся платить налог, если разница между его самым высоким и самым низким склоном строго больше чем 17. Поэтому если он срежет самый высокий склон или увеличит высоту самого низкого склона, так чтобы соответствовать закону (разница не больше 17), он избежит оплаты соответствующего налога за нарушение закона. Если x^2 – стоимость изменения высоты склона на x единиц, какое минимальное количество денег придётся заплатить ФД, Чтобы привести свои склоны в соответствие с новым законом. Высоты меняются только на целую величину x. PROBLEM NAME: skidesign Формат входных данных * Строка 1: Целое число N. * Строки 2..1+N: Каждая строка содержит высоту одного склона. Формат выходных данных * Строка 1: Минимальное количество денег, которое нужно заплатить, чтобы разница между самым высоким и самым низким склонами стала не более чем 17 единиц. Примечание ФД оставит высоты 4, 20, и 21 как они были. Он добавит высоту склону с высотой 1 до высоты 4 (цена = 3^2=9) Он уменьшит высоту 24 до высоты 21 (цена = 3^2=9)
| |
|
|
Fuel Economy
Жадный алгоритм
Фермер Джон решил в отпуске проехать через всю страну. Чтобы коровы не скучали, он решил арендовать огромный грузовик и взять коров с собой. Грузовик имеет огромный бензобак, который может вместить до G (1 <= G <= 1,000,000) единиц топлива. Грузовик потребляет одну единицу топлива на одну единицу расстояния. ФД собирается проехать D (1 <= D <= 1,000,000,000) единиц расстояния. ФД знает, что ему придется несколько раз останавливаться для дозаправки, поэтому он составил список всех N (1 <= N <= 50,000) заправочных станций вдоль маршрута. Для каждой станции i он записал ее расстояние Xi (0 <= Xi <= D) от начала маршрута, а также цену Yi (1 <= Yi <= 1,000,000) заправки единицы топлива на этой станции. По заданной информации и тому факту, что ФД начинает свое путешествие имея ровно B (0 <= B <= D) единиц топлива, определите минимальное количество денег, которое он должен заплатить за дозаправки топливом чтобы достичь точки назначения. Если достичь точки назначения невозможно, выведите -1. Заметим, что ответ на задачу может не помещаться в стандартное 32-битное целое. PROBLEM NAME: fuel Формат входных данных * Строка 1: Четыре разделенных пробелом целых числа: N, G, B, D. * Строки 2..1+N: Каждая строка содержит два целых числа Xi и Yi , описывающих заправочную станцию i. Формат выходных данных * Строка 1: Минимальная цена, которую ФД должен заплатить, чтобы доехать до места назначения или -1, если доехать невозможно. Примечание ФД проезжает 2 единицы расстояния и останавливается, чтобы заправить 2 единицы топлива (цена 40*2), это позволяет доехать ему до станции в позиции 5, где он заправляет полный бак (цена 7*10). Когда он доезжает до позиции 10, он добавляет еще 2 единицы топлива (цена 12*2). Общая цена равна 174.
| |
|
|
Photo
Жадный алгоритм
Фермер Джон решил собрать панорамное фото ряда из своих N (1 <= N <= 200,000) коров, пронумерованных от 1 до N. Он сделал M M (1 <= M <= 100,000) снимков, каждый из которых покрывает непрерывный диапазон коров. Снимок i содержит коров с номерами от ai до bi включительно. Коллективное фото может и не покрывать каждую отдельную корову. ФД заметил интересный феномен: каждый снимок содержит ровно одну корову с пятном. Основываясь на данных снимков, определите максимально возможное количество коров с пятнами. Выведите -1, если невозможно назначить пятна коровам так, чтобы соответствовать данным о снимках. PROBLEM NAME: photo Формат входных данных * Строка 1: Два целых числа N и M. * Строки 2..M+1: Строка i+1 содержит ai и bi. Формат выходных данных * строка 1: Максимально возможное количество коров с пятнами у ФД, или -1, если решения нет. Примечание Из последней фотографии мы получаем, что корова 3 или корова 4 обязательно должны быть с пятном. При любом выборе будет выполнено свойство и для первых двух снимков.
| |
|
|
Poker Hands
Жадный алгоритм
Беси и ее подружки играют в уникальную версию игры в покер с колодой из N (1 <= N <= 100,000) различных рангов, для удобства пронумерованных от 1 до N (в обычной колоде N=13). В этой игре имеется только один тип руки, который корова может играть: можно выбрать карту, помеченную i и карту, помеченную j и играть все карты с каждым значением от i до j. Такой тип руки называется "straight". У Беси на руках сейчас ai карт ранга i (0 <= ai <= 100000). Помогите ей определить минимальное количество рук, которое она должна сыграть, чтобы избавиться от всех своих карт. PROBLEM NAME: poker Формат входных данных * Строка 1: Целое число N. * Строки 2..1+N: Строка i+1 содержит значение величины ai. Формат выходных данных * Строка 1: Минимальное количество "straights", чтобы Беси избавилась от всех своих карт. Примечание Беси может играть следующие straight: 1-5 1-2 4-5 2-2 (2 штуки) 5-5 Всего 6, чтобы избавится от всех карт.
| |
|
|
Taxi
Жадный алгоритм
Беси открыла такси-сервис для других коров на ферме. Коровы собрались в различных местах вдоль изгороди длины M (1<=M<=1,000,000,000) и каждая хочет переместиться в некоторое другое место вдоль изгороди. Беси должна подобрать корову в том месте, где она находится и отвезти в то место, куда она хочет. Автомобиль Беси маленький и за раз может возить только одну корову. Коровы могут входить машину и выходить из нее мгновенно. Беси хочет минимизировать расстояние проезда. Вам даны стартовые и финишные позиции N коров (1 <= N <= 100,000), определите минимальное количество езды, которое должна выполнить Беси. Беси поняла, что иногда выгодно высаживать корову не в позиции ее назначения. Беси начинает в самой левой точке изгороди - позиции 0 и и должна закончить свое путешествие в самой правой точке - в позиции M. PROBLEM NAME: taxi Формат входных данных * Cтрока 1: N и M разделенные пробелом * Строки 2..1+N: (i+1)-ая строка содержит два разделенных пробелом целых числа, si и ti (0 <= si, ti <= M), указывающих стартовую и конечную позиции i-ой коровы.Формат выходных данных * Строка 1: Одно целое число, указывающее общее расстояние, которое проедет Беси. Заметим, что результат может не поместиться в 32-битное целое. Примечание Беси возьмет первую корову в позиции 0 и перевезет ее на позицию 6. Здесь она высадит первую корову и возьмет вторую корову, отвезет куда ей надо, а потом поедет к концу изгороди.
| |
|
|
Milk Scheduling
Жадный алгоритм
У Фермера Джона есть N (1 <= N <= 10,000) коров, которых нужно подоить. Каждая дойка занимает ровно одну единицу времени. Некоторые коровы не любя долго ждать дойки. Точнее корова I производит gi галлонов молока (1<=gi<=1000), но только если её подоить до её дед-лайна – di (1<=di<=10,000). Время начинается в момент t=0. Поэтому не более x коров может быть подоено до дед-лайна t=x. Помогите ФД определить максимальное количество молока, которое он может получить, если установить оптимальный порядок дойки коров. PROBLEM NAME: msched Формат входных данных * Строка 1: Значение N. * Строки 2..1+N: Строка i+1 содержит целые числа gi и di. Формат выходных данных * Строка 1: Максимальное количество галлонов молока, которое может получить ФД Примечание ФД сначал подоит корову 3, не будет доить корову 4, поскольку её дед-лайн конфликтует с коровой 3. Затем ФД подоит коров 1 и 2.
| |
|
|
Landscaping
Жадный алгоритм
Фермер Джон строит сад. Сад состоит из последовательности из N цветочниц (1 <= N <= 100). Каждая цветочница изначально содержит Ai цветов. ФД хочет изменить сад таким образом, чтобы каждая цветочница стала содержать Bi цветов. Ai и Bi - числа от 0 до 10. ФД может делать следующее - купить цветок за X долларов и добавить его в любую цветочницу - убрать цветок из любой цветочницы и это стоит Y долларов - переместить цветок из цветочницы i в цветочницу j за цену Z * abs(i-j) долларов Вычислите минимальную цену выполнения реорганизации сада. PROBLEM NAME: landscape Формат входных данных * Строка 1: Разделенные пробелом целые числа N, X, Y, Z (0 <= X, Y, Z <= 1000). * Строки 2..1+N: Строка i+1 содержит разделенные пробелом целые числа Ai и Bi. Формат выходных данных * Строка 1: Одно целое число - минимальная стоимость реорганизации сада. Примечание Один цветок нужно продать (с цветочницы 4), за цену 200. Остальные цветки можно переместить за цену 10 (3 цветка с цветочницы 4 на цветочницу 1 и 1 цветок с цветочницы 3 на цветочницу 2)
| |
|
|
Mountain Climbing
Жадный алгоритм
Фермер Джон обнаружил, что его коровы дают больше молока, если занимаются спортом. Поэтому он послал N (1 <= N <= 25,000) своих коров взобраться на ближайшую гору и вернуться обратно. Корове I требуется U(i) времени взобраться на гору и D(i) времени, чтобы спуститься с нее. Каждой корове нужна помощь человека, а их всего два ФД и его кузен фермер Дон (ФДо). ФД будет помогать коровам подниматься, а ФДо - спускаться. Поэтому в любой момент времени только одна корова будет подыматься (с помощью ФД) и не более одной коровы - спускаться (с помощью ФДо). Группа коров может временно находится на вершине горы, если они туда взобрались, и ждут помощи от ФДо чтобы спуститься. Коровы могут спускаться в порядке, отличном от того, в котором они подымались. Определите минимальное количество времени, которое требуется всем коровам, чтобы совершить полное путешествие туда и обратно. PROBLEM NAME: climb Формат входных данных * Строка 1: Количество коров, N. * Строки 2..1+N: Строка i+1 содержит два разделенных пробелом целых числа: U(i) и D(i). (1 <= U(i), D(i) <= 50,000). Формат выходных данных * Строка 1: Одно целое число, представляющее минимальное количество времени, которое требуется всем коровам взобраться на гору и вернуться обратно. Примечание Если корова 3 пойдет первой, затем корова 1 и затем корова 2 (и в таком же порядке возвращаться), это и даст суммарное время 17.
| |
|
|
Gifts
Жадный алгоритм
Фермер Джон хочет сделать подарки своим N (1 <= N <= 1000) коровам, используя свой бюджет в B (1 <= B <= 1,000,000,000) единиц денег. Корова I требует подарка с ценой P(i) единиц ценой доставки S(i) (поэтому для ФД будет стоить P(i)+S(i) заказать этот подарок). У ФД есть специальный купон, который он может использовать чтобы заказать подарок за полцены. Если ФД использует этот купон для коровы I, то он должен будет заплатить только P(i)/2 + S(i). По соглашению, все P(i) четные числа. Пожалуйста, помогите ФД определить максимальное количество коров, которым он сможет сделать подарки. PROBLEM NAME: gifts Формат входных данных * Строка 1: Два разделенных пробелом целых числа, N и B. * Строки 2..1+N: Строка i+1 содержит два разделенных пробелом целых числа, P(i) и S(i). (0 <= P(i),S(i) <= 1,000,000,000, P(i)- четное) Формат выходных данных * Строка 1: Максимальное количество коров, которым ФД может купить подарки. Примечание ФД может купить подарки для коров с первой по 4-ую, если он использует Купон для коровы 3. Потраченная сумма будет: (4+2)+(2+0)+(4+1)+(6+3) = 22. Заметим, что ФД альтернативно может использовать купон для коров 1 или 4 И все равно не превысить бюджет.
| |
|
|
Cow Coupons
Жадный алгоритм
Фермер Джон хочет купить новых коров! На продаже имеется N (1 <= N <= 50,000) коров, а у ФД может потратить не более, чем M (1 <= M <=10^14) единиц денег. Корова I стоит Pi денег (1 <= Pi <= 10^9). У ФД имеется K купонов (1<=K<=N). Когда он использует купон для покупки коровы I, то цена будет Ci вместо Pi (1<=Ci<=Pi). Для каждой коровы ФД должен использовать ровно один купон. Какое максимальное количество коров может купить ФД? PROBLEM NAME: coupons Формат входных данных * Строка 1: Три разделенных пробелом целых числа: N, K, M. * Строки 2..N+1: Срока i+1 содержит два целых числа: Pi Ci. Формат выходных данных * Строка 1: Одно целое число, максимальное количество коров, которое может купить ФД. Примечание ФД использует купон при покупке коровы 3 и купит коров 1, 2, 3 за цену 3 + 2 + 1 = 6.
| |
|
|
Wifi Setup
Жадный алгоритм
N (1 <= N <= 2000) коров Фермера Джона расположены на прямой линии (дороге от амбара до пастбища). ФД хочет расставить вдоль этой прямой точки беспроводного доступа в Internet, так чтобы все коровы были в зоне покрытия. Стоимость wifi-станции зависит от расстояния, ан которое она может передавать сигнал. Станция с мощностью(радиусом действия) r стоит A + B*r , где A - фиксированная цена установки станции B - стоимость на 1 расстояния, на которое передается информация. Если такая станция установлена в позиции x, то она может передавать данные до любой коровы, расположенной в интевале x-r...x+r. Допускается станция с мощностью передачи 0, но, поскольку r=0, она будет работать только для коровы, размещенной в самой точке x размещения станции. По заданным величинам A и B, а также координатам коров, определите самый дешевый способ, которым ФД сможет обеспечить беспроводное покрытие всех своих коров. PROBLEM NAME: wifi Формат входных данных * Строка 1: Три разделенных пробелом целых числа: N A B (0 <= A, B <= 1000). * Строки 2..1+N: Каждая строка содержит одно целое число в диапазоне 0..1,000,000 описывающее размещение одной коровы. Формат выходных данных * Строка 1: Минимальная стоимость обеспечения беспроводным покрытием всех коров. Примечание Оптимальное решение - построить базовую станцию в позиции 3.5 (с мощностью/радиусом действия 3.5) и другую станции в позиции 100 с мощностью (радиусом действия) 0. Первая станция обеспечит покрытие коров 1 и 2, вторая - коровы 3.
| |
|
|
Gangs of Instanbull_Cowstantinople
Жадный алгоритм
Коровы сформировали банды, пронумерованные от 1 до M. Теперь эти банды борются за контроль над большим пастбищем. Каждую минуту одна корова идет в поле. Если это поле пустое, считается, что ее банда взяла контроль над ним. Если поле уже под контролем этой банды, то корова просто начинает на нем пастись. Иначе возникает конфликт между новой коровой, и той коровой из другой банды, которая там паслась. В результате этого конфликта обе коровы "аннигилируются" (то есть выходят из своих банд и покидают это поле). Поле становится пустым и бесконтрольным. Никакая банда его не контролирует. Беси знает сколько коров в каждой банде. Беси хочет чтобы ее банда контролировала поле после завершения конфликта. Помогите Беси определить, может ли ее банда (номер 1) контролировать поле в конце. Если это возможно, Беси хочет знать максимальное количество коров из ее банды, которое может остаться на поле в конце. Выведите это количество и лексикографически раннюю перестановку коров, которая приведет к этому числу. Перестановка X называется более ранней чем перестановка Y, если есть некоторое k, для которого X[k] < Y[k] и X[i]=Y[i] для всех i < k. PROBLEM NAME: gangs Формат входных данных * Строка 1: N (1 <= N <= 100) и M (1 <= M <= N) разделенные пробелом. N - общее число коров во всех бандах. M - общее число банд. * Строки 2..1+M: (1+i)-ая строка указывает количество коров в банде i. В каждой банде есть хотя бы одна корова. Формат выходных данных * Строка 1: Выведите YES на одной строке, если банда Беси может взять контроль над полем, иначе выведите NO. * Строка 2: Если банда Беси сможет взять контроль над полем выведите здесь максимальное количество коров, которые там будут пастись после окончания конфликта. * Строки 3..2+N: На (i+2)-ой вывести индекс банды коровы, которая должна появится на i-ой минуте на поле в лексикографически ранней перестановке которая обеспечит максимальное количество коров в поле после конфликта. Примечание Только одна корова из банды Беси может остаться на поле
| |
|
|
Санки в ряд
Жадный алгоритм
Дети Простоквашино выстроили N санок в ряд. Каждые санки имеют определённый вес. Дядя Фёдор хочет выбрать несколько санок подряд (непрерывный отрезок), чтобы их суммарный вес был как можно ближе к числу S (грузоподъёмность трактора), но не превышал его.
Найдите максимальный суммарный вес санок, который можно погрузить на трактор.
Входные данные: В первой строке два числа N и S (1 ≤ N ≤ 10, 1 ≤ S ≤ 10^6). Во второй строке N целых чисел от 1 до 10 — веса санок.
Выходные данные: Максимальный суммарный вес санок, не превышающий S. Если ни одни санки не помещаются, выведите 0.
| |
|
|
Ремонт забора
Жадный алгоритм
Задача на реализацию
Забор состоит из N одинаковых вертикальных досок. Некоторые из досок сгнили и нуждаются в замене, для каждой доски известно, нужно ли её заменить. Для ремонта забора можно использовать продающиеся в магазине щиты, которые бывают L разных видов: шириной в 1 доску, в 2 доски, ..., в L досок. Щит нельзя разрезать на части, то есть одним щитом можно заменить не более любых L подряд идущих досок. При этом можно менять не только сгнившие доски, но и хорошие.
Оказалось, что все щиты стоят одинаково, независимо от размера щита. Определите, какое наименьшее число щитов необходимо приобрести, чтобы починить весь забор.
Входные данные
Первая строка входных данных содержит целое число L (L > 0) – максимальный размер щита. Во второй строке входных данных записано целое число N (N > 0) – количество досок в заборе. Следующие N строк содержат по одному числу, равному 0 или 1. Число 1 обозначает, что соответствующая доска в заборе нуждается в замене, число 0 – что доска может быть сохранена.
Выходные данные
Программа должна вывести одно целое число – минимальное число щитов, которое необходимо приобрести для ремонта всего забора.
| |
|
|
Беспилотная аэрологистика
Жадный алгоритм
Использование сортировки
Вывод формулы
На всероссийской олимпиаде по информатике 2224 года, которая проходит в Иннополисе, доставкой занимаются роботы нового поколения, которые способны создавать своих клонов. Доставку можно получить прямо через окно, не выходя из дома.
Изначально есть только один робот-доставщик. В любой момент верхний робот может создать одного или нескольких новых роботов прямо над собой. Так образуется колонна роботов. Высота каждого робота равна высоте одного этажа.

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

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

Расстояние между препятствиями и окнами достаточно большое, поэтому во время переезда через препятствие роботы не будут проезжать мимо окна.
За доставку одного заказа компания-организатор доставки получает \(p\) крипторублей. Стоимость создания одного нового робота равна \(c\) крипторублей. Итоговая прибыль равна суммарному доходу от доставки заказов за вычетом суммарной стоимости создания всех роботов. Компания хочет максимизировать свою прибыль. При этом, она не обязана выполнить все заказы, а роботы могут в любой момент остановиться, и прекратить процесс доставки.
Определите максимальную прибыль, которую может получить компания.
Формат входных данных
В первой строке входных данных находятся четыре целых числа \(n\), \(m\), \(c\), \(p\) (\(0 \le n, m \le 100\,000\), \(1 \le c, p \le 10^6\)) — количество препятствий, количество заказов в базе, стоимость создания клона робота и стоимость доставки одного заказа, соответственно.
В следующих \(n+m\) строках идёт описание препятствий и окон, в которые нужно доставить заказы, в порядке следования колонны роботов вдоль общежитий слева направо. Каждая строка содержит два целых числа \(t_i\) и \(h_i\) (\(1 \le t_i \le 2\), \(1 \le h_i \le 10^6\)) — тип объекта \(t_i\) (\(1\) для препятствия и \(2\) для окна) и \(h_i\) "— высота препятствия в этажах или этаж, на котором находится окно.
Гарантируется, что ровно \(n\) объектов имеют тип \(1\), и оставшиеся \(m\) объектов имеют тип \(2\).
Формат выходных данных
Выведите одно число — максимальную величину прибыли, которую можно получить.Одна из оптимальных стратегий доставки заказов из первого примера изображена на девяти рисунках ниже, при этом выполнение второго заказа не увеличивает прибыль.
Пояснения к примерам
Одна из оптимальных стратегий доставки заказов из первого примера изображена на девяти рисунках ниже, при этом выполнение второго заказа не увеличивает прибыль.

Во втором примере достаточно один раз клонировать робота для доставки первого заказа, полученной системой роботов доставить второй заказ, а производить дополнительное клонирование для доставки третьего заказа экономически невыгодно.
| |
|
|
Фонари
Жадный алгоритм
Задачи на моделирование
Вдоль прямой улицы на равном расстоянии располагаются N домов. Будем считать расстояние между домами за единицу длины.
Около каждого дома можно поставить один фонарь. Всего имеется A фонарей, которые могут освещать дома на расстоянии X (включительно), и B фонарей, которые могут освещать дома на расстоянии Y (включительно). В частности, при X = 0 или Y = 0 такой фонарь освещает только тот дом, у которого он установлен.
Вам необходимо расставить минимальное число фонарей так, чтобы все дома были освещены. Один дом может быть освещён несколькими фонарями. Освещать участки улицы между домами необязательно.
Формат входных данных
Первая строка входных данных содержит целое число N (1 ≤ N ≤ 105 ). Следующие четыре строки содержат целые неотрицательные числа A, X, B и Y соответственно, которые не превосходят 105 .
Формат выходных данных
Программа должна вывести столько строк, сколько фонарей необходимо установить. Каждая строка должна содержать два целых числа через пробел — координату фонаря и расстояние, которое он освещает (то есть одно из чисел X или Y ). Координаты представляют из себя целые числа от 1 до N, рядом с каждым домом можно поставить только один фонарь. При наличии нескольких правильных ответов можно вывести любой из них. Если ответа не существует, программа должна вывести одно число −1
Замечание
В ответе к первому примеру фонарь у дома 2 освещает также дома 1 и 3, фонарь у дома 5 — также дома 3, 4, 6 и 7, а фонарь у дома 9 — также дома 8 и 10. В результате все дома освещены. Во втором примере фонарей недостаточно.
| |
|
|
Тройка
дп
Жадный алгоритм
Арсений очень любит пользоваться городским транспортом. В городе, где он живёт, существует карта <<Тройка>>, позволяющая оплачивать проезд при помощи тарифа <<Кошелёк>>. Есть два вида тарифа:
-
<<Единый>> (57 рублей) — одна поездка на любом виде транспорта;
-
<<90 минут>> (85 рублей) — не более одной поездки на метро и любое количество поездок на наземном транспорте в течение не более 90 минут с момента начала первой поездки (между началом поездки и началом первой поездки должно пройти не более 90 минут).
Так как Арсений коллекционирует карты <<Тройка>>, у него их очень много, поэтому он может использовать неограниченное количество билетов одновременно.
У него есть планы на ближайшие \(n\) поездок. Помогите мальчику узнать, какое минимальное количество денег он должен потратить для реализации своих планов.
Формат входных данных
Первая строка входных данных содержит целое число \(n\) — количество поездок, которые были запланированы, \(1 \le n \le 10^5\).
Следующие \(n\) строк содержат два значения, разделённые пробелом. Сначала указан вид транспорта: заглавная английская буква <<B>>, если Арсений будет использовать наземный транспорт, или заглавная английская буква <<M>>, если он воспользуется метро. Затем указано время начала поездки в формате ЧЧ:ММ (в виде двузначного количества часов и затем двузначного количества минут).
Поездки указаны в порядке их совершения, но они могут занимать несколько последовательных дней. Если время, записанное в какой-то строке, меньше, чем время в предыдущей строке, то данная поездка была совершена на следующий день. При этом гарантируется, что в каждый день Арсений совершит хотя бы одну поездку.
Также гарантируется, что разница времени совершения двух поездок составляет не менее 10 минут.
Формат выходных данных
Программа должна вывести одно целое число — сколько денег потратит Арсений, если будет максимально эффективно использовать карты.
Примечание
В первом примере все три поездки могут быть оплачены одним тарифом <<90 минут>> за \(85\) рублей.
Во втором примере нужно одним билетом <<90 минут>> за \(85\) рублей оплатить первую (23:59), вторую (00:29) и четвёртую (01:29) поездки. Третью поездку (00:59) нельзя оплатить тем же билетом, потому что в тарифе <<90 минут>> может быть не более одной поездки на метро, для этой поездки придётся использовать отдельный билет за 57 рублей.
В третьем примере первую поездку (22:00) нужно оплатить отдельным билетом за 57 рублей, а следующие три поездки (23:00, 23:50, 00:30) — билетом <<90 минут>>.
| |
|
|
Поможем дикой природе
Жадный алгоритм
Быстрое возведение в степень
Фонд изучения дикой природы в течение \(t\) лет ежегодно выделяет денежные гранты в поддержку исследований северной фауны. На гранты претендуют три организации, одна из которых занимается изучением тюленей, вторая "— оленей, третья "— белых медведей.
Для упрощения бухгалтерского учёта фонд принял следующие решения:
размер любого гранта в денежных единицах должен быть степенью числа 2, то есть равен \(2^k\) для некоторого целого \(k \ge 0\);
все гранты, получаемые одной организацией в одном году, должны иметь различные размеры.
В \(i\)-м году фонд планирует полностью распределить \(n_i\) денежных единиц, выделенных на гранты. Сравнивать результативность использования средств возможно только для грантов одинакового размера, выделенных каждой из трёх организаций. Такие гранты называются целевыми. Распределение денежных единиц на гранты между тремя организациям считается оптимальным, если как можно бОльшая часть общей суммы выделена на целевые гранты.
Например, если в текущем году на все гранты выделено 47 денежных единиц, то оптимальным вариантом распределения будет: выделить каждой из организаций целевые гранты размерами по 2 и 8 денежных единиц, что составит в сумме 30 единиц. Остальные 17 единиц можно распределить, например, выделив первой организации 16 денежных единиц, а третьей — 1 денежную единицу. Выделить более 30 денежных единиц на целевые гранты, распределяя 47 денежных единиц, нельзя.
Требуется написать программу, которая по заданной в \(i\)-м году общей сумме грантов \(n_i\) определяет, сколько денежных единиц следует выделить каждой из трёх организаций при оптимальном распределении грантов.
В первой строке входных данных записано целое число \(t\) — количество лет (\(1 \le t \le 100\)). В каждой из последующих \(t\) строк записано целое число \(n_i\)"— общая сумма грантов, которую необходимо полностью распределить в \(i\)-м году.
Выходные данные должны содержать \(t\) строк по три целых числа в каждой — суммы грантов, которые следует выделить каждой из трёх организаций в соответствующий год. Если оптимальных вариантов распределения несколько, необходимо вывести любой из них.
| |
|
|
Пингвиноведение
Динамическое программирование: один параметр
Жадный алгоритм
На кафедре пингвиноведения Южного Антарктического университета проводятся исследования популяций пингвинов. Фотографии скоплений плотно стоящих пингвинов обрабатываются студентами. Распознавание пингвинов на снимках производится следующим образом: на фотографии выбирается характерная полоса высотой в один пиксель, каждый пиксель которой входит в изображение одного из пингвинов.
У всех пингвинов исследуемой популяции живот белый, а спина и крылья — чёрные. Таким образом, если у пингвина на фотографии видна только спина, то на характерной полосе ему соответствует отрезок из чёрных пикселей, а если только живот, то из белых. В остальных случаях, например, когда чёрные крылья видны поверх белого живота, пингвину соответствует отрезок из чёрных и белых пикселей. Для продолжения исследований необходимо, чтобы каждому пингвину соответствовал отрезок, состоящий либо только из чёрных, либо только из белых пикселей.
Для \(i\)-й фотографии известно максимальное количество пингвинов \(k_i\), изображение которых могло попасть на характерную полосу. Поэтому эту полосу пикселей необходимо заменить на упрощённую полосу той же длины, которая будет состоять не более чем из \(k_i\) отрезков, каждый из которых либо полностью чёрный, либо полностью белый. Из всех возможных упрощённых полос нужно выбрать оптимальную — то есть ту, которая получается из характерной путём изменения цвета минимального числа пикселей.
Требуется написать программу, решающую поставленную задачу.
Входные данные
В первой строке входных данных содержится число \(t\) — количество фотографий. Далее следуют \(t\) пар строк, \(i\)-я пара строк описывает \(i\)-ю фотографию.
Первая строка описания фотографии содержит два числа: \(n_i\) — длину характерной полосы \(i\)-й фотографии, и \(k_i\) — максимальное количество пингвинов, которые могут быть на ней изображены (\(k_i \le n_i\)).
Вторая строка описания состоит из \(n_i\) символов 0 и 1, где 0 обозначает чёрный, а 1 — белый пиксель.
Выходные данные
Выходные данные должны содержать \(t\) строк, где \(i\)-я строка состоит из \(n_i\) символов 0 и 1 и описывает упрощённую полосу, полученную из характерной полосы \(i\)-й фотографии. Если оптимальных упрощённых полос несколько, выведите любую из них.
| |
|
|
Бродвей - 2
Бинарный поиск по ответу
Жадный алгоритм
Ввиду тесноты на Бродвее, некоторые из бродвейских театров хотят переехать на соседнюю улицу. Эта улица тоже прямая, но в отличие от предыдущей задачи, расстояния между домами могут быть произвольными.
Для уменьшения конкуренции театры хотят разместиться в домах на этой улице так, чтобы минимальное расстояние между двумя соседними театрами было как можно больше.
Входные данные
Первая строка входных данных содержит количество домов на улице N и количество театров K (1 ≤ K ≤ N ≤ 104). Далее идет N чисел в порядке возрастания – координаты домов на улице.
Выходные данные
Выведите единственное число – наибольшее возможное допустимое расстояние между театрами.
| |
|
|
Операнды - 2
Жадный алгоритм
Задача на реализацию
Алина выписала на доске \(n + 1\) цифру, каждая из которых от \(1\) до \(9\). Даша поставила между каждой парой соседних цифр знак одной из арифметических операций <<+>>, <<->>, <<*>> и <</>> (плюс, минус, умножить, целочисленное деление). Затем девочки отправились в столовую на обед.
Вернувшись, они обнаружили, что с доски все стерто, к счастью Даша смогла вспомнить, какие знаки и в каком порядке были расставлены. Также девочки считают, что результатом применения операций было небольшое число.
Они просят вас зная последовательность знаков, расставить цифры от \(1\) до \(9\) между ними так, чтобы итоговый результат был минимальным.
Формат входных данных
В первой строке входного файла дано число \(n\), число знаков, которые написала Даша (\(1 \le n \le 1000\)).
Во второй строке находится \(n\) знаков арифметических операций <<+>>, <<->>, <<*>> и <</>> (без кавычек).
Формат выходных данных
Выведите в единственной строке файла последовательность из \(n + 1\) цифры, таким образом, чтобы при расстановке между ними знаков итоговый результат был минимальным.
Если возможных решений несколько, разрешается вывести любое.
| |
|
|
Очередь за комплексом
Жадный алгоритм
Использование сортировки
реализация
Федок очень хочет купить себе комплексный обед в столовой, но сделать это не так просто. В столовой работает всего одна касса, и то очень медленно. На данный момент в очереди находится \(n\) \((2 \leq n \leq 100\,000)\) людей, а сам Федок находится на \(k-\)ой \((1 \leq k \leq n)\) позиции в ней. И вот, чтобы занять себя в этой очереди, Федок стал обдумывать коварный план как побыстрее оплатить комплексный обед и начать есть.
В чем состоит коварный план? Федок хочет крикнуть, что открылась новая касса. Тогда, по его мнению, многие уйдут из очереди в поисках этой кассы, а он приблизится к заветной еде. Но вот в чем проблема: не все люди так нетерпеливы как наш герой. Проще говоря, у каждого человека есть свой параметр \(P_i\) — терпеливость. Если человек стоит на позиции \(x\) и его терпеливость равна \(y\), то он уйдет искать новую кассу только в том случае, если \(y < x\)
Казалось бы, эта задача трудна, но и Федок не глуп. Он своим метким взором определил терпеливости всех людей, стоящих в очереди кроме него. Увы, так как людей очень много, в его голове все перепуталось, и некоторые числа поменялись местами. Таким образом наш герой получил некоторую перестановку множества терпеливости всех людей в очереди \(P_1, P_2, \ldots, P_{n-1}\)
Федок не знает точно, кто насколько терпелив и боится, что не сдвинется в очереди после реализации своей задумки. Поэтому он просит вас помочь ему узнать, какую минимальную и максимальную позицию от начала очереди он может занимать после того как крикнет: <<Свободная касса!>>
Формат входных данных
В первой строке входных данных находится число людей в очереди \(n\) (\(2 \leq n \leq 100\,000\))
Во второй строке находится число \(k\) (\(1 \leq k \leq n\)) — текущая позиция Федка в очереди
В следующей строке содержатся \(n-1\) число — перестановка множества терпеливостей людей в очереди \((0 \leq P_i \leq n)\)
Формат выходных данных
В первой строке выведите минимальное место, которое может стать у Федка после применения его плана
Во второй строке выведите максимальное место, которое может стать у Федка после применения его плана
-
Решения, работающие для \(n \leq 10\) будут набирать не менее 5 баллов
-
Решения, работающие для \(n \leq 1000\) будут набирать не менее 10 баллов
Замечание
Пояснение к первому тесту:
Алексей стоит на второй позиции. Перед ним один человек.
Если его терпеливость будет равна нулю, то он уйдет, и Федок станет первым
Если же его терпеливость равна трем, то он не уйдет, и Федок останется второй
| |
|
|
Гостиница для жирафов
Двоичная система счисления
Жадный алгоритм
В гостинице для жирафов администрация хочет запастись подушкам так, чтобы удовлетворить потребности любого своего возможного постояльца. Известно, что жирафам в зависимости от длины их шеи нужно сложить стопку подушек (в стопке одна или несколько подушек) толщиной от \(1\) до \(n\) сантиметров. При этом администрация хочет обойтись как можно меньшим числом подушек, а среди наборов подушек, удовлетворяющих этим требованиям, администрация выберет набор минимальной суммарной толщины, чтобы он занимал минимальный объём в шкафу.
Помогите администрации составить нужный набор подушек, позволяющий получить стопку любой высоты от \(1\) до \(n\) сантиметров включительно.
Формат входных данных
Во входных данных записано единственное целое число \(n\) — максимально возможная длина шеи жирафа (\(1 \leq n \leq 10^9\)).
Формат выходных данных
В единственной строке через пробел выведите толщину каждой подушки в этом наборе в произвольном порядке. Если ответов несколько, выведите любой из них.
Замечание
В примере из условия необходимо подобрать такой набор из минимального числа подушек, чтобы используя данные подушки удавалось сложить стопку любой целочисленной толщины от \(1\) до \(9\) см. Таким набором является набор из подушек толщиной \(1\), \(2\), \(3\), \(3\) см. Действительно, стопку толщины \(1\), \(2\), \(3\) см можно сложить из одной подушки. Оставшиеся числа получены так: \(4=1+3\), \(5=2+3\), \(6=3+3\), \(7=1+3+3\), \(8=2+3+3\), \(9=1+2+3+3\). Возможны и другие варианты ответа с тем же количеством подушек и их суммарной толщиной. Выполнить условие задачи, используя только три подушки, нельзя.
| |
|
|
Пары
Жадный алгоритм
Вывод формулы
Задано четыре числа: \(a\), \(b\), \(c\) и \(d\). Требуется разбить их на две пары, чтобы сумма произведений в этих парах была максимальна.
Например, если заданы числа 2, 3, 4 и 5, то оптимально разбить их на пары \((2, 3)\) и \((4, 5)\), в этом случае искомая сумма равна \(2 \times 3 + 4 \times 5 = 26\).
Формат входных данных
На вход подаются четыре числа: \(a\), \(b\), \(c\) и \(d\). Все числа по модулю не превышают 1000.
Формат выходных данных
Выведите искомую максимальную сумму.
| |
|
|
Трансформация массива - 2
Жадный алгоритм
Задача на реализацию
Вам дано \(t\) пар массивов \(a_i\) и \(b_i\) равной длины.
За одну операцию модификации можно:
-
Поменять местами любые два элемента массива \(a_i\), но каждый элемент массива может участвовать не более чем в одном обмене.
-
Прибавить к любому элементу массива \(a_i\) единицу. Данную операцию можно применять неограниченное число раз к любому элементу массива.
Для каждой пары массивов найдите минимальное число операций, которые необходимо применить к массиву \(a_i\), чтобы получить массив \(b_i\), или определите, что это невозможно.
Входные данные
В первой строке дано число \(t\) — число пар массивов (\(1 \le t \le 40\)).
В следующих \(3t\) строках содержатся описания пар массивов. Каждая пара описывается тремя строками.
В первой из них дано число \(n_i\) — количество элементов в каждом массиве \(i\)-й пары(\(1 \le n_i \le 10\)). Во второй строке заданы \(n_i\) чисел \(a_{i,j}\) — элементы массива \(a_i\) (\(1 \le a_{i,j} \le 1000\)). В третьей строке заданы \(n_i\) чисел \(b_{i,j}\) — элементы массива \(b_i\) (\(1 \le b_{i,j} \le 1000\)).
Гарантируется, что сумма \(n_i\) по всем тестовым наборам не превосходит \(150\).
Выходные данные
Для каждого пары массивов выведите одно число — минимальное число операций, которые необходимо применить к массиву \(a_i\), чтобы получить массив \(b_i\), или \(-1\), если для данной пары это невозможно.
| |
|
|
Обработка пар чисел - 1
Линейные алгоритмы
Остатки
Жадный алгоритм
Имеется набор данных, состоящий из пар положительных целых чисел.
Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма всех выбранных чисел делилась на 4 и при этом была максимально возможной.
Формат входных данных
В первой строке количество пар N (1 ≤ N ≤ 100000). Каждая из следующих N строк содержит два натуральных числа, не превышающих 10 000.
Программа должна напечатать одно число – максимально возможную сумму, соответствующую условиям задачи.
Формат выходных данных
Выведите значение найденной максимальной суммы. Если такой суммы нет, то выведите -1.
| |
|
|
Ханойская фабрика
Жадный алгоритм
Использование сортировки
реализация
Наверняка вы слышали об известной задаче про Ханойские башни, но мало кто знает, что существует целая фабрика, производящая кольца для этой замечательной игры. Однажды на эту фабрику пришел срочный заказ от властителя Египта — Солнцеликого. Солнцеликий требует немедленно прислать ему для игры как можно более высокую башню. Работники фабрики не были готовы к такому необычному заказу, поэтому им придётся собрать какую-то башню из уже произведённых колец.
На складах фабрики находятся \(n\) колец, \(i\)-е кольцо имеет внутренний радиус \(a_i\), внешний радиус \(b_i\) и высоту \(h_i\). Требуется выбрать некоторые из этих колец и упорядочить их таким образом, чтобы выполнялись следующие условия:
-
Внешние радиусы колец образовывали невозрастающую последовательность, то есть кольцо \(j\) можно поставить на кольцо \(i\) только если \(b_j \leq b_i\).
-
Кольца не должны проваливаться друг в друга, то есть кольцо \(j\) можно поставить на кольцо \(i\) только если \(b_j > a_i\).
-
Суммарная высота всех использованных колец должна быть максимальна.
Формат входных данных
В первой строке входных данных записано целое число \(n\) (\(1 \leq n \leqslant 100\,000\)) — количество колец на складах фабрики.
В \(i\)-й из последующих \(n\) строк записаны три числа \(a_i\), \(b_i\) и \(h_i\) (\(1 \leq a_i, b_i, h_i \leq 10^9\), \(b_i > a_i\)) — внутренний радиус, внешний радиус и высота \(i\)-го кольца соответственно.
Формат выходных данных
Выведите максимальную высоту башни, которую смогут получить работники фабрики.
Замечание
В первом примере выгодно поставить друг на друга все имеющиеся кольца в порядке \(3\), \(2\), \(1\).
Во втором примере можно либо поставить кольцо \(3\) на кольцо \(4\) и получить башню высоты \(3\), либо поставить кольцо \(1\) на кольцо \(2\) и получить башню высоты \(4\).
В данной задаче 50 тестов, помимо тестов из условия, каждый из них оценивается в 2 балла. Результаты работы ваших решений на первых 30 тестах будут доступны во время соревнования. Результаты работы на остальных 20 будут доступны после окончания соревнования.
Решение, корректно работающие при \(1 \leq n \leq 9\), наберут не менее \(10\) баллов.
Решение, корректно работающие при \(1 \leq n \leq 15\), наберут не менее \(20\) баллов.
Решение, корректно работающие при \(1 \leq n \leq 1000\), наберут не менее \(60\) баллов.
| |
|
|
Парковка - 2
Жадный алгоритм
Использование сортировки
Специально для \(n\) сотрудников ИТМО, пользующихся личными автомобилями, планируется открыть парковку. На парковке должно быть ровно \(n\) парковочных мест, каждому сотруднику должно достаться свое место.
Для экономии мест парковка будет разбита на несколько <<рядов>>. Места в каждом ряду нумеруются от \(1\) (самое дальнее от въезда) до длины ряда (самое ближнее ко въезду), и дальние места недоступны, пока не освободятся все более ближние.
Для каждого сотрудника известно, в какое время он приезжает, и в какое время заканчивает работу. Так как сотрудники ИТМО — очень трудолюбивые люди, каждый из них приезжает на работу в один день, а уезжает уже в следующий. Для каждого известно время, в которое он приезжает на работу \(t^\mathrm{in}_i\), и время, в которое он уезжает на следующий день \(t^\mathrm{out}_i\). Требуется назначить места сотрудникам так, чтобы никому из них не понадобилось ждать
-
появления доступного парковочного места, когда он приезжает;
-
возможности выехать, когда он заканчивает работу.
Более формально, если сотрудникам \(i\) и \(j\) назначены места \(p_i\) и \(p_j\) в одном ряду, и \(p_i < p_j\), должно выполняться \(t^\mathrm{in}_i \le t^\mathrm{in}_j\) и \(t^\mathrm{out}_i \ge t^\mathrm{out}_j\).
Определите, какое минимальное число рядов понадобится, чтобы можно было распределить всех сотрудников по местам на парковке указанным образом, и найдите соответствующее распределение сотрудников по местам.
Формат входных данных
В первой строке ввода дано единственное целое число \(T\) — количество наборов входных данных (\(1 \le T \le 100\)). Далее следуют описания наборов входных данных.
В первой строке описания набора входных данных дано единственное целое число \(n\) — количество сотрудников, которых необходимо разместить на парковке.
Гарантируется, что сумма \(n\) по всем наборам входных данных не превосходит \(10^5\).
В следующих \(n\) строках перечислены времена въезда и выезда для каждого сотрудника, в \(i\)-й строке через пробел \(t^\mathrm{in}_i\) и \(t^\mathrm{out}_i\) (\(1 \le t^\mathrm{in}_i, t^\mathrm{out}_i \le 10^9\)).
Формат выходных данных
Выведите ответ на задачу для каждого набора входных данных в том порядке, в котором они перечислены во вводе.
В первой строке выведите число \(k\) — минимальное необходимое количество рядов.
В \(i\)-й из следующих \(n\) строк выведите через пробел сначала номер ряда, а затем номер места в этом ряду, которое надо отдать \(i\)-му сотруднику. Ряды и места нумеруются с единицы.
Если существует несколько различных ответов, минимизирующих \(k\), выведите любой из них.
| |
|
|
Раздвоитель
Жадный алгоритм
Линейные алгоритмы
Исполнитель “Раздвоитель” преобразует натуральные числа. У него есть две команды: “Вычесть 1” и “Разделить на 2”, первая команда уменьшает число на 1, вторая команда уменьшает число в два раза, если оно чётное, иначе происходит ошибка.
Входные данные
Программа получает на вход два натуральных числа A и B (по одному числу в строке).
Выходные данные
Напишите алгоритм для Развоителя, который преобразует число A в число B и при этом содержит минимальное число команд. Команды алгоритма нужно выводить по одной в строке, первая команда обозначается, как -1, вторая команда как :2.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
21
2 |
-1
:2
:2
-1
:2 |
| |
|
|
Морской бой
Жадный алгоритм
Задачи на моделирование
реализация
В старом игровом автомате «Морской бой» игрок сбивает торпедами корабли, двигающиеся по игровому полю слева направо или справа налево.
В нашем варианте игры на поле может находиться одновременно несколько кораблей. Все корабли движутся с одинаковыми скоростями налево или направо. За одну секунду каждый корабль передвигается на единицу длины системы координат. Это означает, что через одну секунду после начала игры корабль, который находился в точке 20 и двигался направо, будет находиться в точке 21, а корабль, который находился в точке 30 и двигался налево, окажется в точке 29.
Вы можете выпускать торпеды, которые будут подбивать корабли. Торпеда, выпущенная в точке с какой-то координатой, уничтожает корабль, находящийся в этот момент в этой точке. При этом если в этой точке в этот момент времени окажется несколько кораблей, то торпеда подобьёт все эти корабли. Вы даже можете одновременно выпускать несколько торпед!
Подбейте все корабли, используя минимальное число торпед.
Входные данные
В первой строке содержится целое число N — количество кораблей, движущихся влево (с уменьшением координаты). Во второй строке содержится целое число M — количество кораблей, движущихся вправо (с увеличением координаты). Гарантируется, что 1 ≤ N + M ≤ 105, N > 0 и M > 0.
Следующие N строк содержат по одному целому числу li — начальные координаты кораблей,двигающихся влево. Следующие M строк содержат по одному целому числу ri — начальные координаты кораблей, двигающихся вправо. Координаты li идут в порядке возрастания, координаты ri также заданы в порядке возрастания. Гарантируется, что все начальные координаты li и ri чётные, различные и не превосходят по модулю 109.
Выходные данные
Программа должна вывести столько строк, сколько торпед необходимо для уничтожения всех кораблей, при этом i-я строка должна содержать два целых числа ti — время нанесения удара i-й торпедой и xi — координату удара i-й торпедой. Все ti и xi должны быть целыми, 0 ≤ ti ≤ 1018 , −1018 ≤ xi ≤ 1018. В один момент времени можно выпускать несколько торпед, в одну точку можно выпускать несколько торпед в разные моменты времени.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
2
1
10
30
20 |
0 10
5 25 |
Замечание
В примере из условия два корабля движутся влево и один корабль движется вправо. Начальные координаты кораблей, двигающихся влево, равны l1 = 10 и l2 = 30, а начальная координата корабля, двигающегося вправо, равна r1 = 20. В момент времени t1 = 5 в одной точке x1 = 25 окажутся два корабля — двигающийся влево из точки 20 и двигающийся вправо из точки 30. Их можно подбить одной торпедой. Оставшийся корабль, двигающийся влево, можно подбить, например, в момент времени t2 = 2 в точке x2 = 8.
| |
|
|
Престижный номер
Арифметические алгоритмы (Теория чисел)
Жадный алгоритм
В одной очень влиятельной организации для упрощения контроля въезда автотранспорта сотрудников на территорию решили, что автомобильные номера у всех сотрудников должны иметь одинаковое произведение цифр, равное числу N.
Номера в этой стране могут быть любыми натуральными числами, а жители страны очень любят «маленькие» номера — чем меньше число в номере автомобиля, тем более престижным он считается.
Директор организации хочет, чтобы ни у кого из сотрудников не было более престижного номера, чем у него. Поскольку организация очень влиятельная, директор может получить любой номер по своему желанию.
Входные данные
Программа получает на вход одно натуральное число N, не превосходящее 1018, — произведение
цифр автомобильных номеров сотрудников очень влиятельной организации.
Обратите внимание, значение N может превышать возможное значение 32-битной целочисленной переменной, поэтому необходимо использовать 64-битные целочисленные типы данных (тип long long в языке C++, тип int64 в Pascal, тип long в Java и C#).
Выходные данные
Выведите одно целое число — минимальное значение номера автомобиля директора очень влиятельной организации.
Если ни одного подходящего номера не существует, программа должна вывести число «−1».
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
70 |
257 |
| 2 |
101 |
-1 |
| |
|
|
Заказ в магазине
Жадный алгоритм
Вывод формулы
Решив запастись ручками на весь новый учебный год, Игорь подсчитал, что ему нужно M ручек.
В его любимом интернет-магазине есть удобная функция — он может сразу добавить в заказ упаковку из любого числа ручек от 1 до N. Правда, оказалось, что нельзя добавить в заказ две упаковки одного размера. Например, если Игорю нужно купить M = 12 ручек, а максимальное число ручек в упаковке N = 10, то Игорь может добавить в заказ упаковку из 7 ручек и упаковку из 5 ручек, но не сможет добавить две упаковки из 6 ручек.
Сформируйте заказ на M ручек, используя минимальное число различных упаковок.
Входные данные
Первая строка входных данных содержит число N — максимальный размер одной упаковки (1 ≤ N ≤ 109 ). Вторая строка входных данных содержит целое число M — необходимое количество ручек в заказе (1 ≤ M ≤ 109 ).
Выходные данные
Программа должна вывести одно или несколько чисел от 1 до N — размеры выбранных упаковок в любом порядке. Есть имеется несколько возможных решений, то выведите любое из них. Если решения не существует, необходимо вывести одно число «0».
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
10
12 |
5
7 |
| 2 |
2
5 |
0 |
| |
|
|
Длинный плакат
Стек
Жадный алгоритм
Юный художник Вася нарисовал плакат с очень большим числом и решил повесить его на самую длинную стену школы. К сожалению, даже самая длинная стена оказалась недостаточно длинной, поэтому ему придется укорачивать плакат до нужной длины. Вася — максималист, поэтому он хочет, чтобы число, получившееся после всех правок, было как можно больше. Васе нужно вырезать из плаката любые K цифр, но он ни за что не согласится переставлять получившиеся кусочки местами, так как это нарушит цветовой баланс плаката. Помогите Васе переделать плакат.
Входные данные
В первой строке входных данных записано целое число N, записанное на изначальном длинном плакате. Гарантируется, что в N не менее двух и не более 200 000 цифр (10 ≤ N < 10200 000).
Во второй строке содержится целое число K — количество цифр, которые необходимо вырезать из плаката. Гарантируется, что K не меньше одного и строго меньше количества цифр числа N (1 ≤ K, 10K ≤ N).
Выходные данные
Выведите максимальное число, которое может получиться на плакате после его укорачивания
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
2023
1 |
223 |
Замечание
В примере из условия на плакате записано число 2023, из него нужно вырезать одну цифру.
Максимально число, которое можно при этом получить, равно 223.
| |
|
|
Программа для Громозеки
Жадный алгоритм
Задачи на моделирование
Когда Громозека держит в руках сразу две печеньки с числами, он сразу пробует преобразовать большее число в меньшее. При преобразовании он использует только две команды: “Вычесть 1” и “Разделить на 2”, первая команда уменьшает число на 1, вторая команда уменьшает число в два раза, если оно чётное, иначе происходит ошибка. Громозека любит, чтобы преобразование происходило как можно быстрее. Помогите Громозеке составить последовательность команд, при которой из большего числа получится меньшее, причем за наименьшее количество команд.
Входные данные
Программа получает на вход два натуральных числа A и B (по одному числу в строке). A >= B.
Выходные данные
Выведите последовательность команд преобразования. Каждая команда должна выводиться в отдельной строке. Первая команда обозначается, как -1, вторая команда как :2.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
21
2 |
-1
:2
:2
-1
:2 |
| |
|
|
Гость из прошлого
Жадный алгоритм
Задачи на моделирование
Коля Герасимов очень любит кефир, и в своём 1984 году он освоил все тонкости покупки этого чудесного напитка. Но однажды, как вам, наверное, известно, он попал в далёкий 2084 год, где покупка кефира представляет собой более сложный процесс.
Будущее будущим, а кушать хочется всегда, поэтому Коля отправился в местную молочную лавку. В 2084 году кефир продают в литровых пластиковых бутылках по a копеек за штуку и в литровых бутылках из стекла по b копеек за штуку. При этом пустую стеклянную бутылку можно сдать и получить назад c (c < b) копеек, а пластиковую бутылку сдать нельзя.
У Коли в кармане есть n копеек, и он очень голоден, поэтому хочет выпить как можно больше литров кефира. Так как в его время не было пластиковых бутылок, он совсем не знает, как действовать. Поэтому он обратился за помощью к вам, как к единственному знакомому в будущем.
Входные данные
В первой строке входных данных задаётся число n (1 <= n <= 1018)— количество копеек у Коли в кармане.
В строках со второй по четвертую по одному записаны числа a, b и c (1 <= a <= 1018, 1 <= c < b <= 1018) - стоимость пластиковой бутылки с кефиром, стоимость стеклянной бутылки с кефиром и сколько копеек можно получить, сдав пустую стеклянную бутылку, соответственно.
Выходные данные
Выведите одно целое число — максимальное количество литров кефира, которое сможет выпить Коля.
Пояснения к примерам
В первом примере Коля может купить один литр в стеклянной бутылке, затем сдать эту бутылку и снова купить стеклянную бутылку. Таким образом, он сможет выпить два литра кефира.
Во втором примере Коля может купить две пластиковые бутылки и получить два литра кефира или купить сначала один литр в стекле, потом сдать бутылку и купить одну бутылку в пластике. В обоих случаях он купит два литра кефира.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
10
11
9
8 |
2 |
| 2 |
10
5
6
1 |
2 |
| |
|
|
Странное устройство
Жадный алгоритм
Вывод формулы
По приезде Василий с Петром обнаружили в своем номере в гостинице странный прибор. Он был оснащен дисплеем, на котором показывалось число 0, и двумя кнопками. Василий сразу понял, что первая кнопка увеличивает число на дисплее на 1, а вторая умножает его на K. В этот момент Петр обнаружил на своей кровати листок бумаги, на котором было написано единственное число N.
Теперь друзья хотят воспроизвести число N на дисплее найденного ими устройства, и, поскольку их ждет еще множество дел, им интересно минимальное число нажатий на кнопки устройства для получения числа N.
Входные данные
В первой строке входных данных записано целое неотрицательное число N (1 ≤ N ≤ 109 ).
Во второй строке входных данных записано целое положительное число K (2 ≤ K ≤ 109 ).
Выходные данные
Выведите единственное число — минимальное количество нажатий на кнопки устройства для получения на его дисплее числа N.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
4
2 |
3 |
Замечание
В примере из условия Василий и Петр хотят воспроизвести число 4. Кнопка умножает на 2 число, которое показывается на дисплее. Первой операцией друзья увеличивают текущее число на 1, нажимая первую кнопку, после чего оно становится равно 1. Затем они умножают его на 2, нажимая вторую кнопку. Текущее число становится равно 2. После чего, для получения на дисплее числа 4 достаточно один раз нажать вторую кнопку и умножить текущее число (то есть 2) на 2. Несложно показать, что меньше, чем за три операции, получить число 4 невозможно. Таким образом, минимальное число действий равняется трем.
| |
|
|
Гости
Жадный алгоритм
Сортировка событий
Вася переехал из своего родного города и очень скучает по старым друзьям. К сожалению, Вася снимает маленькую квартиру и одновременно в гости к нему может приехать только один друг. Каждый друг сказал Васе два числа A и B - с какого по какой день он может приехать в гости.
Каждый друг приезжает и уезжает в полдень. Каждый друг может приехать к Васе только один раз и остаться у него на несколько дней. Вася хотел бы, чтобы суммарное количество дней, когда у него в гостях есть кто-нибудь из друзей, было максимальным. Помогите ему определить даты приезда для каждого из друзей так, чтобы они не пересекались (допустима ситуация, что в один день один из друзей уезжает, а другой - уезжает) и суммарное время, когда у Васи в гостях есть кто-то из друзей, было максимальным.
Формат входных данных
В первой строке записаны целое число N (1 ≤ N ≤ 100000) - количество друзей Васи. В следующих N строках записано по два целых числа Ai и Bi (оба числа от 1 до 109) - возможное время приезда i-го друга.
Формат выходных данных
Выведите N пар чисел Li и Ri - номера дней, в которые приедет и уедет i-й друг соответственно (Ai ≤ Li ≤ Ri ≤ Bi). Если i-го друга приглашать не нужно, выведите пару чисел -1 -1. Если правильных ответов несколько - выведите любой из них.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
3
1 2
2 4
3 5 |
1 2
3 4
5 5 |
| 2 |
3
2 3
1 4
3 5 |
-1 -1
1 4
5 5 |
| |
|
|
Разнообразное питание - 2
Жадный алгоритм
Вывод формулы
Увлекшись машинным обучением, Вася совсем забыл про свои экзамены в университете, завалил их и пошел служить в армию. Однако, и тут ему пригодились его навыки программиста — у работников столовой возникла проблема с тем, что блюда постоянно повторяются, и солдаты начали слишком этому возмущаться. Узнав, что Вася разбирается в программировании, работники попросили его написать программу, которая сделает распределение блюд.
Работники столовой считают, что единственное, что характеризует распределение блюд — их «степень немонотонности» — число разных блюд, которые даются в последовательные приемы пищи. То есть, если представить расписание блюд как массив a, то «степень немонотонности» будет равна количеству индексов i, таких что \(a_i \neq a_{i-1}\) . Для начала вас просят найти не само распределение блюд, а хотя бы максимальную возможную «степень немонотонности», которую можно было бы получить некоторой перестановкой заданного набора блюд. Помогите армейской столовой!
Входные данные
В первой строке содержится число n — количество блюд, которые должны войти в расписание (1 ≤ n ≤ 100).
В следующей строке содержится n чисел ai — блюда (1 ≤ ai ≤ 100). Одинаковые блюда обозначены одинаковыми числами, разные — разными.
Выходные данные
В единственной строке выведите одно число — максимальное возможное значение «степени немонотонности».
| Ввод |
Вывод |
5
1 2 3 1 1 |
4 |
4
1 1 1 2 |
2 |
| |
|
|
Дипломы в папках
Жадный алгоритм
Вывод формулы
реализация
В этом году Иван заканчивает школу и поступает в вуз. За время своей учебы он часто участвовал в олимпиадах по информатике и у него накопилось много дипломов. Иван раскладывал дипломы по папкам совершенно бессистемно, то есть любой диплом мог оказаться в любой из папок. К счастью, Иван помнит, сколько дипломов лежит в каждой из папок.
Иван хочет принести в приемную комиссию выбранного вуза папку, в которой находится диплом Московской олимпиады по программированию (такой диплом у Ивана ровно один). Для того чтобы понять, что в данной папке нужного диплома нет, Ивану нужно просмотреть все дипломы из этой папки. Чтобы открыть одну папку Ивану нужно потратить одну секунду, просмотр одного диплома занимает у него также одну секунду, и он может мгновенно переходить к следующей папке после окончания просмотра предыдущей. Порядок просмотра папок Иван может выбирать. То, что в пустых папках диплом можно не искать, Ивану очевидно.
По заданному количеству дипломов в каждой из папок требуется определить, за какое наименьшее время в худшем случае Иван поймет, в какой папке содержится нужный ему диплом.
Входные данные
В первой строке входного файла записано целое число N (1 ≤ N ≤ 105) - количество папок. Во второй строке записаны N целых чисел a1, a2, ..., aN (0 ≤ ai ≤ 105) - количество дипломов в каждой из папок.
Выходные данные
Выведите одно число - минимальное количество секунд, необходимое Ивану в худшем случае для определения того, в какой папке содержится диплом.
Примечание
В первом примере Иван может открыть и просмотреть папку 2 за 2 секунды и, не найдя там диплома, понять, что диплом находится в папке 1.
Во втором примере Иван за 2 секунды просмотрит папку 1, потом за 2 секунды просмотрит папку 4, а если ни в одной из них диплома не встретилось, он поймет, что диплом в папке 3.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
2
2 1 |
2 |
| 2 |
4
1 0 2 1 |
4 |
| |
|
|
Держать строй - 2
Жадный алгоритм
Вывод формулы
В воинской части города Шатров продолжаются занятия по строевой подготовке. Молодой прапорщик Андрей Юрьевич уже приноровился проводить эти занятия, но тут его начальник Павел Андреевич стал давать ему новые, более сложные задания.
Как известно, обычно все солдаты выстраиваются в шеренгу по росту, начиная с самого низкого. Но Павлу Андреевичу это показалось слишком скучным и он потребовал от Андрея Юрьевича выстроить солдат в другом порядке. Случайный порядок ему показался слишком хаотичным, поэтому он потребовал построения, в котором будет ровно k инверсий. Инверсией называется такая пара солдат, что более высокий из них стоит в шеренге раньше более низкого.
К счастью для Андрея Юрьевича, все солдаты разного роста и для каждого он знает, какой он по росту среди всех солдат. Исходя из этого, каждому солдату Андрей Юрьевич присвоил номер: первый номер получил самый низкий, а последний — самый высокий солдат.
Например, в построении (3, 1, 2) есть две инверсии — пары (3, 1) и (3, 2), в которых более высокий солдат стоит раньше более низкого.
Андрей Юрьевич поручил Вам помочь ему в построении солдат в требуемом порядке, и для этого вы должны написать программу, находящую расстановку n солдат в порядке, в котором есть ровно k инверсий.
Входные данные
Первая и единственная строка входного файла содержит два целых числа n и k (1 ≤ n ≤ 100 000) — количество солдат в строю и требуемое количество инверсий.
Гарантируется, что существует построение солдат с требуемым числом инверсий, то есть 0 ≤ k ≤ n(n - 1) / 2.
Выходные данные
В выходной файл выведите n целых чисел — построение солдат в требуемом порядке.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
3 2 |
3 1 2 |
| 2 |
3 0 |
1 2 3 |
| |
|
|
Таблица
Жадный алгоритм
Задачи на моделирование
В новой математической игре для одного игрока «Таблица чисел» используется таблица размером n строк на m столбцов, заполненная целыми числами. За один ход игрок выбирает одну из строк или один из столбцов и меняет знак на противоположный у всех чисел этой строки или столбца.
Цель игры состоит в том, чтобы привести таблицу в такой вид, что сумма чисел в каждой строке и каждом столбце является неотрицательной. При этом минимизировать количество ходов не требуется, но можно сделать не более 20000 ходов.
Ваша задача состоит в том, чтобы написать программу, которая по описанию начального вида таблицы, найдет последовательность ходов, которая ведет к достижению цели игры, или определит, что цель игры недостижима.
Входные данные
Первая строка входного файла содержит два целых числа: n и m (2 ≤ n, m ≤ 100). Каждая из последующих n строк содержит по m целых чисел ai,j (|ai,j| ≤ 100).
Выходные данные
В первой строке выходного файла выведите k — число ходов, которые необходимо выполнить, или «-1», если цели игры добиться невозможно. В первом случае в последующих k строках выведите описание этих ходов.
Описание каждого хода должно быть выведено в отдельной строке, которые должны содержать: тип хода («R» — на этом ходе выбирается строка или «C» — на этом ходе выбирается столбец) и номер соответствующей строки или столбца. Строки и столбцы нумеруются натуральными числами начиная с единицы, строки нумеруются сверху вниз, а столбцы — слева направо.
Выведенная вашей программой последовательность ходов должна содержать не более 20000 ходов. Гарантируется, что если существует последовательность ходов, ведущая к достижению цели игры, то существует и последовательность, удовлетворяющая указанному ограничению
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
2 2
-1 -3
1 -2 |
1
C 2 |
| 2 |
3 2
-1 -1
-1 -1
-1 -1 |
3
R 1
R 2
R 3 |
| |
|
|
Улыбочку!
Жадный алгоритм
реализация
Начались каникулы, и дядя Фёдор, изрядно соскучившись по своим школьным друзьям, пригласил их всех в гости к себе в Простоквашино. После некоторых раздумий n из них согласились приехать. Взяв с собой все необходимые для отдыха на природе вещи, они приехали на вокзал покупать билеты. Выяснилось, что в поездах, идущих до Простоквашино, есть только купейные вагоны. В каждом вагоне всего k4 четырехместных купе и k2 — новых двухместных купе. Кроме друзей дяди Фёдора, никто не хочет ехать в Простоквашино, поэтому все места в поезде пока свободны. Друзья решили, что они хотят поехать все в одном вагоне: вместе ведь веселее. Чтобы поездка запомнилась надолго, один из друзей дяди Фёдора, Женя, решил одолжить у папы фотоаппарат «Зенит» и сфотографировать всех участников поездки, сидящих каждый на своем месте в поезде, по одному снимку на купе. Но пленка дорогая, а проявка — это долго и нудно, поэтому Женя попросил купить билеты так, чтобы вся дружная компания занимала как можно меньше купе. Помогите Жене посчитать, сколько в лучшем случае ему понадобится кадров, чтобы сфотографировать всю компанию, то есть посчитайте, сколько минимально купе они должны занять.
Входные данные
В первой и единственной строке вводятся числа n, k4 и k2 — количество друзей дяди Фёдора, едущих в Простоквашино, количество четырехместных купе в вагоне и количество двухместных купе в вагоне соответственно (1≤n≤1018, 0≤k4≤1018, 0≤k2≤1018).
Выходные данные
Выведите одно целое число — минимальное количество купе, в которых можно разместить всех друзей дяди Фёдора. Если же разместить всех друзей в одном вагоне не получится, выведите −1.
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
10 5 3 |
3 |
| |
|
|
Автомат по продаже билетов
Жадный алгоритм
реализация
В Московском метрополитене вновь появляются автоматы для продажи билетов. Вас просят написать программу, которая будет рассчитывать, какую сдачу и какими купюрами и монетами требуется выдать пассажиру.
Входные данные
Вводится сначала стоимость билета, который хочет приобрести пассажир, затем общее количество купюр и монет, которые он опустил в автомат, а затем достоинства каждой из этих купюр и монет. Входные данные записаны в одной строке и разделены пробелами. Известно, что сумма всех купюр больше, чем стоимость билета. Во всех тестовых примерах стоимость билета – натуральное число, не превосходящее 1 000 рублей, количество купюр и монет не более 50, достоинство каждой не превосходит 500 рублей. Общая сумма денег, опущенных в автомат покупателем, превосходит стоимость билета.
Выходные данные
Программа должна вычислить, какими купюрами и монетами можно выдать сдачу, и вывести достоинство каждой из этих купюр или монет в произвольном порядке. Автомат может выдавать сдачу купюрами в 10, 50, 100 и 500 рублей, а также монетами в 1, 2 и 5 рублей. Если решений несколько, требуется выдать одно любое из них. Если решений нет, требуется выдать текст:
Sorry! Our monetary system is not perfect!
Please, choose another way to pay!
Thank you!
Примеры
| № |
Входные данные |
Выходные данные |
| 1 |
100 1 500 |
50 100 100 100 50 |
| |
|
|
Напитки и стаканы - 1
Использование сортировки
Жадный алгоритм
К Коле на день рождения придут n друзей. По этому случаю он заготовил n бутылок различных напитков, а каждый из друзей принесет свой стакан.
Коля знает размеры стаканов каждого друга, однако, может случиться так, что содержимое конкретной бутылки может не поместиться полностью в конкретный стакан, если объем бутылки больше объема стакана. При этом Коля не хочет, чтобы после угощения что-то осталось, поэтому будет разливать напитки только так, чтобы они полностью поместились в стаканы.
Напиток полностью помещается в стакан, если объем, содержащей его бутылки, не превосходит объем стакана.
Коля хочет своеобразно оценить сколько способов есть разлить напитки по стаканам друзей так, чтобы все напитки полностью поместились в стаканы. Так как число способов может быть довольно большим, Коля хочет знать его по модулю 1 000 000 007. Помогите Коле посчитать это число.
Входные данные
В первое строке дано число t - число тестовых наборов (1≤t≤100).
Каждый тестовый набор задается тремя строками. В первой из них дано число ni - число бутылок напитков и стаканов в i-ом наборе (1≤ni≤105).
Во второй строке заданы ni чисел ai,j - объемы бутылок в i-м наборе.
В третьей строке даны ni чисел bi,j - объемы стаканов в i-м наборе (1≤ai,j,bi,j≤100).
Гарантируется, что сумма ni по всем тестовым наборам не превосходит 3⋅105.
Выходные данные
Для каждого тестового набора выведите одно число - число способов разлить напитки по стаканам друзей так, чтобы все напитки полностью поместились в стаканы, взятое по модулю 1 000 000 007.
Примеры
| № |
Входные данные |
Выходные данные |
Пояснение |
| 1 |
3
3
1 1 1
1 2 1
5
1 2 3 4 5
1 2 3 4 5
3
2 2 2
2 1 2 |
6
1
0 |
В первом тестовом наборе любой напиток помещается в любой стакан. Во втором тестовом наборе, существует лишь один способ разлить напитки. В третьем наборе ни один напиток не поместится во второй стакан, поэтому ответ будет ноль |
| |
|
|
Разнообразное питание
Жадный алгоритм
Задачи на моделирование
Увлекшись машинным обучением, Вася совсем забыл про свои экзамены в университете, завалил их и пошел служить в армию. Однако, и тут ему пригодились его навыки программиста — у работников столовой возникла проблема с тем, что блюда постоянно повторяются, и солдаты начали слишком этому возмущаться. Узнав, что Вася разбирается в программировании, работники попросили его написать программу, которая сделает распределение блюд.
Работники столовой считают, что единственное, что характеризует распределение блюд — их «степень монотонности» — число одинаковых блюд, которые даются в последовательные приемы пищи. То есть, если представить расписание блюд как массив a, то «степень монотонности» будет равна количеству индексов i, таких что ai = ai - 1. Для начала вас просят найти не само распределение блюд, а хотя бы минимальную возможную «степень монотонности», которую можно было бы получить некоторой перестановкой заданного набора блюд. Помогите армейской столовой!
Входные данные
В первой строке содержится число n — количество блюд, которые должны войти в расписание (1 ≤ n ≤ 100).
В следующей строке содержится n чисел ai — блюда (1 ≤ ai ≤ 100). Одинаковые блюда обозначены одинаковыми числами, разные — разными.
Выходные данные
В единственной строке выведите одно число — минимальное возможное значение «степени монотонности».
| Ввод |
Вывод |
5
1 2 3 1 1 |
0 |
6
1 1 2 3 1 1 |
1 |
| |
|
|
Много пирожных
Использование сортировки
Жадный алгоритм
На кондитерской фабрике есть n видов пирожных, пирожных i-го вида на фабрике ai штук. Было принято решение отвезти пирожные на продажу на ярмарку, но директор фабрики решил, что кондитерские изделия на ярмарочной витрине должны быть выложены одинаковыми рядами, при этом пирожных каждого вида должно быть одинаковое количество. Необязательно отвозить на ярмарку все виды пирожных, можно выбрать некоторые виды и взять одинаковое число пирожных каждого выбранного вида.
Помогите директору отвезти на ярмарку наибольшее число пирожных - найдите, сколько видов пирожных и сколько пирожных каждого вида нужно отвезти на ярмарку.
Формат входных данных
Первая строка входных данных содержит число n - количество видов пирожных на фабрике, 1 <= n <= 105.
Следующие n строк содержат по одному числу ai - количество пирожных i-го вида, 1 <= ai <= 105.
Сумма всех значений ai не превосходит 2 x 109.
Формат выходных данных
Программа должна вывести два целых числа. Первое число равно количеству видов пирожных, которые необходимо выбрать для ярмарки. Второе число равно количеству пирожных каждого выбранного вида, которые нужно отвезти на ярмарку.
Если возможных ответов несколько, выведите любой из них.
Пояснение к примеру. Имеется 3 вида пирожных количеством 4, 10 и 7 штук. Наилучший ответ будет, если взять по 7 пирожных второго и третьего вида.
| |
|
|
Музыкальный плейлист
Жадный алгоритм
реализация
Недавно Вася решил, что все существующие алгоритмы сортировки слишком сложны, и обязательно должен существовать более простой и эффективный алгоритм.
Для начала Вася решил рассмотреть следующий алгоритм: по данному массиву целых чисел a размером n, он создает пустой массив b, а дальше на каждой из n последующих итераций будет брать k-й элемент массива a (или последний, если такого нет), удалять его из a, а затем записывать в конец b. Таким образом, после n итераций Вася планирует в качестве массива b получить отсортированный по возрастанию массив a.
Однако, протестировав на нескольких примерах, Вася понял, что этот алгоритм работает не всегда. Так, например, если исходный массив a=[1,2,3,4] и k=2, то после 4 итераций массив b вовсе не будет отсортированным:
После первой итерации в b добавляется число 2, а массив a равен [1,3,4];
После второй итерации в конец b добавляется число 3, а массив a равен [1,4];
После третьей итерации в конец b добавляется число 4, а массив a равен [1];
На последней, четвертой итерации, в конец b добавляется число 1, а массив a становится пустым;
Таким образом, итоговый массив b будет выглядеть так: [2,3,4,1]. Нетрудно заметить, что он не является отсортированным по возрастанию. Однако, Вася решил так легко не сдаваться и по данному числу k научиться находить такой массив a, содержащий перестановку последовательности натуральных чисел от 1 до n, который будет сортироваться по возрастанию методом, описанным выше. Помогите ему - по данным числам n и k найдите хотя бы один подходящий массив a.
Формат входных данных
В единственной строке содержится два числа n и k - размер массива и номер элемента, берущегося на каждой итерации, соответственно (1≤k≤n≤1000).
Формат выходных данных
В единственной строке через пробел выведите n чисел - элементы массива, который отсортируется по возрастанию способом Васи. Если существует несколько ответов, выведите любой.
| Ввод |
Вывод |
| 5 1 |
1 2 3 4 5 |
| 5 5 |
5 4 3 2 1 |
| |
|
|
Ремонт дороги
Жадный алгоритм
Длина автомобильной дороги составляет N километров. Часть дороги необходимо отремонтировать. При обследовании дорога была разбита на N участков длиной 1 километр, и для каждого участка было определено, нуждается ли он в ремонте или нет, после чего был составлен план дороги, на котором отмечены участки, нуждающиеся в ремонте.
Для ремонта дороги можно привлечь несколько компаний-подрядчиков. Каждая компания может отремонтировать только непрерывный фрагмент дороги. При этом из-за требований антимонопольного законодательства длина фрагмента дороги, который ремонтирует одна компания, не должна превышать L километров (даже если на фрагменте, который ремонтирует одна компания, есть не нуждающиеся в ремонте участки, общая длина данного фрагмента не должна превышать L километров).
Определите, какое наименьшее количество компаний-подрядчиков необходимо привлечь для ремонта дороги.
Первая строка входных данных содержит целое число L (L > 0) — максимальную длину фрагмента дороги, который может отремонтировать одна компания. Во второй строке входных данных записано целое число N (N > 0) — длина всей дороги. Следующие N строк содержат по одному числу, равному 0 или 1. Число 1 обозначает, что соответствующий участок дороги нуждается в ремонте, число 0 — что участок не требует ремонта.
Программа должна вывести одно целое число — минимальное количество компанийподрядчиков, которое необходимо привлечь для ремонта дороги.
| Ввод |
Вывод |
Примечание |
3
8
0
0
1
0
1
0
1
0 |
2 |
Первая компания может отремонтировать участок номер 3, вторая компания — участки с 5 по 7. |
| |
|
|
Оптом – дешевле!
Жадный алгоритм
Задачи на моделирование
В Москве начал работать новый оператор сотовой связи, предоставляющий доступ в интернет посредством технологии 3G. Новый оператор предлагает простые и невысокие
тарифы, в частности, один мегабайт интернет-трафика стоит 1 рубль.
Кроме того, оператор предлагает покупать оптовые пакеты трафика – есть два предложения: купить пакет трафика на A мегабайт за B рублей и купить пакет трафика на C мегабайт за D рублей.
Таня планирует использовать в течение месяца N мегабайт интернет-трафика. Определите минимальную сумму, которую придётся ей заплатить. Таня может приобретать
любое количество каждых из двух предлагаемых пакетов, а также оплачивать трафик по тарифу «1 рубль за мегабайт». Таня может приобретать пакеты интернет-трафика и в том
случае, если суммарный оплаченный трафик будет более N мегабайт, если это выйдет дешевле.
Программа получает на вход пять натуральных чисел N, A, B, C, D, записанных в отдельных строках, не превосходящих 500 000 каждое. Гарантируется, что A > B и C > D.
Программа должна вывести одно целое число – минимальную сумму, которую нужно заплатить для приобретения N мегабайт трафика.
| Ввод |
Вывод |
Примечание |
35
10
9
20
17 |
31 |
Пакет на 10 мегабайт стоит 9 рублей, пакет на 20 мегабайт
стоит 17 рублей. Для оплаты 35 мегабайт нужно купить пакет
на 10 мегабайт и пакет на 20 мегабайт, а за оставшиеся 5
мегабайт заплатить 5 рублей.
|
55
30
20
20
16 |
40 |
Пакет на 30 мегабайт стоит 20 рублей, пакет на 20 мегабайт
стоит 16 рублей. Для оплаты 55 мегабайт нужно купить два
пакета на 30 мегабайт, что суммарно будет стоить 40 рублей. |
| |
|
|
Ёж
Жадный алгоритм
реализация
Тем временем Ёж решил покатать шары из снега. В итоге у него получилось N шариков с диаметрами a1, a2, … an, все они различны. Из них он хочет собрать как можно больше НОРМАЛЬНЫХ снеговиков. Нормальный снеговик состоит из трёх шаров, диаметр которых снизу вверх строго уменьшается. Сколько максимум снеговиком он сможет собрать?
|
Ввод |
Вывод |
|
6
2
3
4
5
6
7
|
2 |
(с) Манаев И., Кашукова М., 2018 г.
| |
|
|
Лифт в бизнес-центре
Жадный алгоритм
Задачи на моделирование
реализация
Рабочий день закончился, и сотрудники бизнес-центра собрались по домам. Бизнесцентр представляет собой N-этажное здание, этажи пронумерованы от 1 до N снизу вверх. Все сотрудники хотят спуститься на парковку, которая расположена в подвальном помещении на один этаж ниже первого. Бизнес-центр оборудован лифтом, который может перевозить не более K человек одновременно. Лифт перемещается вверх или вниз на один этаж за одну секунду, посадка и высадка пассажиров происходят мгновенно. Изначально лифт расположен на уровне парковки. Известно, сколько людей хотят спуститься на парковку с каждого
из N этажей. Определите, какое минимальное время потребуется, чтобы перевезти на парковку всех сотрудников бизнес-центра.
Первая строка входных данных содержит наибольшее возможное число людей в лифте K, 1 ≤ K ≤ 109
Вторая строка содержит число этажей в бизнес-центре N, 1 ≤ N ≤ 105
Следующие N строк содержат целые неотрицательные числа – число людей, ожидающих лифт на 1, 2, … , N-м этаже соответственно, эти числа не превосходят 109 каждое. В здании находится хотя бы один человек.
Программа должна вывести ровно одно целое число – наименьшее время в секундах, за которое всех людей можно перевезти на парковку.
|
Ввод |
Вывод |
Примечание |
2
3
3
0
1 |
8 |
Лифт перевозит 2 человек, в здании 3 этажа. Лифт поднимается на первый этаж за 1 с, забирает 2 человек и за 1 с спускается на парковку, затем лифт поднимается на первый этаж, забирает 1 человека, вместе с ним поднимается на третий этаж, забирает 1 человека и спускается на парковку. Подъём на третий этаж занимает 3 с, спуск – ещё 3 с. |
| |
|
|
Тяжелая, вариант-2
Жадный алгоритм
Разбор случаев
В школьную столовую пришли n учеников разных классов и выпили суммарно k стаканов компота. Кассирша тетя Таня хорошо знает всех учеников, поэтому про i-го пришедшего школьника она знает число ai — максимальное количество стаканов компота, которое мог выпить этот школьник. Также она знает, i-й школьник выпьет явно не меньше ai-x стаканов компота. Теперь ей стало интересно: а какое максимальное количество стаканов компота гарантированно выпил один из школьников? То есть она хочет найти такое максимальное число m, что при любом корректном распределении количества выпитых стаканов компота между школьниками, школьник, выпивший максимальное количество стаканов компота, выпил их не менее чем m штук. Помогите ей с этой задачей.
Формат входного файла
В первой строке находятся три натуральных числа n, k, x (1 ≤ n ≤ 100; 1 ≤ k ≤ 2 · 104; 1 ≤ x ≤ 100) — количество школьников, пришедших в столовую, количество стаканов компота, выпитого ими, и максимальное количество стаканов, на которое каждый школьник мог выпить менее своего максимального количества, соответственно.
В следующей строке находятся n целых чисел ai (x+1 ≤ ai ≤ 200), разделенных пробелами, — максимальное количество стаканов компота, которое выпил i-й школьник.
Гарантируется, что входные данные корректны.
Формат выходного файла
В единственной строке требуется вывести максимальное количество стаканов компота m, которое гарантированно выпил один из школьников.
Пример входных и выходных данных
| Ввод |
Вывод |
Комментарий |
3 4 1
2 2 3 |
2 |
Так как всего было выпито 4 стакана компота, а школьники выпили хотя бы 2-1=1, 2-1=1 и 3-1=2 стакана соответственно, первый школьник выпил ровно 1 стакан, второй — ровно 1 стакан, третий — ровно 2 стакана. Следовательно, ответ равен 2. |
3 6 1
2 2 3 |
2 |
Каждый из школьников мог выпить по 2 стакана компота. Значит, ответ 3 гарантировать нельзя. Следовательно, ответ равен 2. |
3 7 1
2 2 3 |
3 |
Так как всего выпито 7 стаканов компота, хотя бы один школьник выпил 3 стакана. Ответ 4, очевидно, недостижим. Следовательно, ответ равен 3. |
3 12 2
3 4 6 |
5 |
Первый школьник выпил хотя бы 1 стакан и не более 3, второй — хотя бы 2 и не более 4, третий — хотя бы 4 и не более 6. Невозможно выпить 12 стаканов компота, если третий школьник выпьет ≤ 4 стакана, следовательно, ответ равен 5. |
| |
|
|
Тяжелая, вариант-1
Жадный алгоритм
Задачи на моделирование
В школьную столовую пришли n учеников разных классов и выпили суммарно k стаканов компота. Кассирша тетя Таня хорошо знает всех учеников, поэтому про i-го пришедшего школьника она знает число ai — минимальное количество стаканов компота, которое мог выпить этот школьник. Также она знает, i-й школьник выпьет явно не больше ai+x стаканов компота. Теперь ей стало интересно: а какое максимальное количество стаканов компота гарантированно выпил один из школьников? То есть она хочет найти такое максимальное число m, что при любом корректном распределении количества выпитых стаканов компота между школьниками, школьник, выпивший максимальное количество стаканов компота, выпил их не менее чем m штук. Помогите ей с этой задачей.
Формат входного файла
В первой строке входного файла input.txt находятся три натуральных числа n, k, x (1 ≤ n ≤ 100; 1 ≤ k ≤ 2 · 104; 1 ≤ x ≤ 100) — количество школьников, пришедших в столовую, количество стаканов компота, выпитого ими, и максимальное количество стаканов, которое каждый школьник мог выпить сверх своего минимального количества, соответственно.
В следующей строке находятся n целых чисел ai (1 ≤ ai ≤ 100), разделенных пробелами, — минимальное количество стаканов компота, которое выпил i-й школьник.
Гарантируется, что входные данные корректны.
Формат выходного файла
В единственной строке выходного файла output.txt требуется вывести максимальное количество стаканов компота m, которое гарантированно выпил один из школьников.
Пример входных и выходных данных
|
Ввод |
Вывод |
Комментарий |
3 4 1
1 1 2 |
2 |
Так как всего было выпито 4 стакана компота, а школьники выпили хотя бы 1, 1 и 2 стакана соответственно, первый школьник выпил ровно 1 стакан, второй — ровно 1 стакан, третий — ровно 2 стакана. Следовательно, ответ равен 2. |
3 6 1
1 1 2 |
2 |
Каждый из школьников мог выпить по 2 стакана компота. Значит, ответ 3 гарантировать нельзя. Следовательно, ответ равен 2. |
3 7 1
1 1 2 |
3 |
Так как всего выпито 7 стаканов компота, хотя бы один школьник выпил 3 стакана. Ответ 4, очевидно, недостижим. Следовательно, ответ равен 3. |
3 12 2
1 2 4 |
5 |
Первый школьник выпил хотя бы 1 стакан и не более 3, второй — хотя бы 2 и не более 4, третий — хотя бы 4 и не более 6. Невозможно выпить 12 стаканов компота, если третий школьник выпьет ≤ 4 стакана, следовательно, ответ равен 5. |
| |
|
|
День рождения
Жадный алгоритм
Разбор случаев
На день рождения пришли N человек. В некоторый момент именинник решил, что пора устроить какую-нибудь игру. Он выяснил, что i-й человек согласен вступить в игру, если в ней уже принимают участие не менее A[i] и не более B[i] человек. Единожды вступив в игру, никто из нее
не выходит.
Требуется выяснить, может ли именинник установить такую
последовательность вступления в игру, что в итоге все
присутствующие станут ее участниками. (Сам именинник в игре участия
не принимает.)
Входные данные.
Сначала вводится количество гостей N (1<=N<=100). Затем вводится
N пар чисел A[i] и B[i] (все эти числа из диапазона от 0 до N-1).
Выходные данные.
Если можно установить последовательность вступления гостей в игру,
чтобы в итоге все стали ее участниками, то нужно вывести номера гостей
в том порядке, в каком они могут вступать в игру. Если всех вовлечь
в игру не удастся, выведите одно число - 0.
Пример 1
Пример входного файла
5
4 4
0 3
1 4
1 3
2 2
Пример выходного файла
2 3 5 4 1
Пример 2
Пример входного файла
3
1 1
1 1
1 1
Пример выходного файла
0
Пример 3
Пример входного файла
1
0 0
Пример выходного файла
1
| |
|
|
Узник нейропривода
Жадный алгоритм
Разбор случаев
2022 год. Человечество совершило прорыв в области электроники. Был создан всеми ожидаемый нейропривод, позволяющий человеку совершить полное погружение в видеоигру. Полная передача эмоций, самые настоящие чувства и ощущения и т.д.
И как вы думаете, что попросил Павлик у Дедушки Мороза на новый год? Конечно же нейропривод а так же только что вышедшую под него “Borderlands 5 online”.
Первого января, после получения своего подарка, Павлик начал играть. Паша был лютым геймером, поэтому прокачивался с космической скоростью. Это позволило ему в первый же день игры развести 5 новичков на деньги и шмот. Конечно Дедушке Морозу это не понравилось, и он решил проучить Павлика. Он заблокировал Павлику доступ вернуться в реальность и послал ему в игре злого босса по имени Даня Зевс, элитного игрока команды NA’VI по CS GO в прошлом. Чтобы выбраться в реальность Павлику необходимо победить босса.
У Дани Зевса n здоровья. У Павлика же есть Дробовик с a1 патронами и наносящий а2 урона, пистолет с b1 патронами и наносящий b2 урона и снайперская винтовка с с1 патронами и наносящая с2 урона.
Какое минимальное количество выстрелов необходимо сделать Павлику, чтобы убить босса, если это вообще возможно.
Входные данные
В первой строке записано число n – количество здоровья у Данечки Зевса.
Во второй строке записаны числа а1 и а2 – количество патрон и урон дробовика.
В третей строке записаны числа b1 и b2 – количество патрон и урон пистолета.
В четвертой строке записаны числа с1 и с2 – количество патрон и урон снайперской винтовки.
0<=n,a1,a2,b1,b2,c1,c2<=2*10^9
Выходные данные
Вам необходимо вывести минимальное количество выстрелов, которое необходимо сделать Павлику или -1, если Павлик не сможет убить босса
Пример
Ввод
20
7 1
3 5
10 2
Вывод
6
(с) Курбатов Егор 9и
| |
|