Алгоритмы

590 задачвместе с подтемами
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.
Дан массив произвольных целых чисел. Напишите программу, которая за один проход по массиву находит непрерывный кусок, сумма чисел в котором максимальна.
Примечание. Фактически требуется найти такие i и j (i<=j), что сумма всех элементов массива от ai до aj включительно будет максимальна. Индексация элементов начинается с 1.

Входные данные
В первой строке задается натуральное число n <= 100000 — количество элементов в массиве. В следующих n строках задаются сами элементы массива — целые числа, по модулю не превосходящие 30 000.

Выходные данные
Выведите пару искомых значений индексов. Если таких пар несколько, то j должно быть минимально возможным, а при равных j значение i должно быть максимально возможным. В первой строке выведите i, во второй - j.
 
Примеры
Входные данные Выходные данные
1 5
-1
2
3
-2
2
2
3
2 7
2
-2
3
-1
5
-2
7
3
7
На плоскости даны N точек. Вам требуется построить выпуклую оболочку данного множества точек. Выведите два числа: периметр и площадь.

Входные данные
Первая строка содержит количество точек N, 1≤N≤10000. Каждая из последующих N строк содержит два целых числа – координаты xi и yi. Все числа по модулю не превосходят 104.

Выходные данные
Вывести два числа: периметр и площадь выпуклой оболочки.
 
Ввод Вывод
4
0 0
3 4
3 1
6 0
16.0000000000
12.0000000000

Даны натуральные числа abc. Если уравнение \(ax+by=c\) имеет решения в целых числах, то выберите то решение, в котором число x имеет наименьшее неотрицательное значение и выведите это решение (два числа x и y через один пробел). Если решения не существует, то выведите слово Impossible.

Входные данные 
Вводятся три натуральных числа.

Выходные данные
Выведите ответ на задачу.

Примечание
Сложность алгоритма должна быть равна сложности алгоритма Евклида + константа.
 
Примеры
Входные данные Выходные данные
1 1 2 3 1 1
2 10 6 8 2 -2
По заданному изображению неориентированного графа (имеет ребра весом 0 и 1), выведите список кратчайших расстояний от вершины 0 до всех остальных.
 
Входные данные 
Дано изображение неориентированного графа с ребрами 0 и 1.
 
Выходные данные
В ответе выведите список кратчайших путей от вершины 0.
✓ 60✗ 35800средняяВойти и решать
Вам дано описание дорожной сети страны. Ваша задача – найти длину кратчайшего пути между городами А и B.

Формат входных данных
Сеть дорог задана во входном файле следующим образом: первая строка содержит числа N и K (1<=N<=100000, 0<=K<=300000), где K – количество дорог. Каждая из следующих K строк содержит описание дороги с двусторонним движением – три целых числа ai, bi и li (1aibiN, 1li106). Это означает, что имеется дорога длины li, которая ведет из города ai в город bi. В последней строке находятся два числа А  и В  – номера городов, между которыми надо посчитать кратчайшее расстояние (1<=A,B<=N )

Формат выходных данных
Вы должны вывести в выходной файл единственное число – расстояние между требуемыми городами. Если по дорогам от города А  до города В  доехать невозможно, выведите –1.
 

В теории кодирования часто используют беспрефиксные коды наборы слов, ни одно из которых не является префиксом. Слово α называется префиксом слова β, если α получается из β удалением нуля или более символов в конце. Например, слова a, ab и aba являются префиксами слова aba. Например, набор слов aba, aa и bac является беспрефиксным кодом, а набор abac, aba, ba нет, поскольку слово aba является префиксом слова abac.

 Профессор Дешифро работает в лаборатории исследования бесполезной информации и изучает свое новое изобретение почти беспрефиксные коды. Набор слов называется почти беспрефиксным кодом уровня k, если наибольший общий префикс двух любых слов из набора не превышает по длине k. Например, набор abac, abс, ba является почти беспрефиксным кодом уровня 2, а набор abac, abab, ba нет, поскольку наибольший общий префикс слов abac и abab имеет длину 3.

 Очередная задача, которую профессор Дешифро поставил своим лаборантам, заключается в следующем: по заданному набору слов и числу k требуется выбрать из заданных слов максимальный набор, который является почти беспрефиксным кодом уровня k. Вам, как младшему лаборанту, поручили написать соответствующую программу.

 
Входные данные
Первая строка входного файла содержит два целых числа: n и k количество слов в заданном наборе и уровень почти беспрефиксного кода, который требуется построить (\(1<= n <= 100000\), \(0 <= k <= 200\)). Следующие n строк содержат по одному слову. Слова состоят из строчных букв латинского алфавита. Длина каждого слова от 1 до 200 символов. Суммарная длина всех слов не превышает \(10^6\). Все слова различны.
 
Выходные данные
Выведите одно число m - максимальное количество слов, которые можно выбрать из заданного набора, чтобы они образовывали почти беспрефиксный код уровня k

 

Примеры
Входные данные Выходные данные
1
6 2
aba
bacaba
abacaba
baca
abac
caba
3
Последовательность 011212201220200112… строится следующим образом: сначала пишется 0, затем повторяется следующее действие: уже написанную часть приписывают справа с заменой 0 на 1, 1 на 2, 2 на 0, и т.д.
 
Требуется написать программу, которая по заданному натуральному числу N определяет, какое число стоит на N-ом месте.
 
Входные данные
Дано натурально число число N (1 ≤ N ≤ 1018).
 
Выходные данные
Выведите число, которое стоит на k-ом месте в последовательности.
 
Ввод Вывод
1 0
10 2
Двое играют в игру. Есть несколько кучек спичек. За один ход разрешается взять любое ненулевое количество спичек из любой кучки, кто не может сделать ход, тот проиграл. Определите, кто выигрывает при правильной игре.
 
Входные данные
В первой строке входного файла записано натуральное число N — количество кучек. Во второй строке записаны N целых чисел — количество спичек в кучках. Все числа во входном файле не превосходят 100000.
 
Выходные данные
Выведите «1», если выигрывает первый игрок или «2», если выигрывает второй игрок. Если выигрывает первый игрок, во второй строке выведите число K — общее количество выигрышных ходов. В последующие K строк выведите информацию о выигрышных ходах — пары чисел, перечисленные в порядке возрастания первой координаты, а при равенстве в порядке возрастания второй координаты. В каждой такой паре первое число должно обозначать номер кучки, а второе — количество спичек, которые необходимо взять из этой кучки.

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

✓ 19✗ 361 000средняяВойти и решать
Двое играют в игру. Есть несколько кучек спичек. За один ход разрешается взять любое ненулевое количество спичек из любой кучки, кто не может сделать ход, тот проиграл. Определите, кто выигрывает при правильной игре.
 
Формат входных данных
В первой строке входного файла записано натуральное число N — количество кучек. Во второй строке записаны N целых чисел — количество спичек в кучках. Все числа во входном файле не превосходят 100000.
 
Формат выходных данных
Выведите «1», если выигрывает первый игрок или «2», если выигрывает второй игрок.
Напомним содержание первой серии. Двое играют в такую игру: перед ними лежит шоколадка размера NxM. За ход можно разломить имеющийся кусок шоколадки вдоль одной из сторон на 2 "непустых".
 
Однако, нельзя разламывать куски размером не больше, чем 1k (куски можно поворачивать; мы считаем, что один кусок "не больше" другого, если он равен ему или его части). Таким образом, нельзя разламывать куски размером 11, 12, , 1k, а остальные куски разламывать можно.
 
Теперь куски, которые нельзя ломать, можно есть (не более одного за раз).
 
За один ход можно либо разламывать подходящий по размеру кусок, либо есть.
 
Проигрывает тот, кто не может сделать ход. Определите, кто же станет победителем в игре, если известны начальные размеры шоколадки.
 
Входные данные
Вводятся целые числа 0 < N, M, K <= 100.
 
Выходные данные
Выведите 1 или 2 - номер игрока, который выиграет при правильной игре.

Ввод Вывод
1 1 1 1
1 1 100 1

✓ 12✗ 561 000средняяВойти и решать
Двое играют в такую игру: перед ними лежит шоколадка размера NxM. За ход можно разломить имеющийся кусок шоколадки вдоль одной из сторон на 2 "непустых".
 
Однако, нельзя разламывать куски размером не больше, чем 1k (куски можно поворачивать; мы считаем, что один кусок "не больше" другого, если он равен ему или его части). Таким образом, нельзя разламывать куски размером 11, 12, , 1k, а остальные куски разламывать можно.
 
Проигрывает тот, кто не может сделать ход. Определите, кто же станет победителем в игре, если известны начальные размеры шоколадки.
 
Входные данные
Вводятся целые числа 0 < N, M, K <= 100.
 
Выходные данные
Вывести 1 или 2 - номер игрока, который выиграет при правильной игре.

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

 

Верс нужно подготовить рапорт о последнем боевом вылете. Она уже сочинила в голове текст, осталось лишь его записать. Рапорт будет состоять из двух частей: первая будет содержать n слов, i-е из которых состоит из ai букв, вторая — m слов, j-е из которых состоит из bj букв. Язык Крии не содержит никаких знаков препинания. Верс должна записать рапорт на клетчатом рулоне бумаги, шириной w клеток. Так как рапорт состоит из двух частей, она разделит вертикальной чертой рулон на две части целой ширины, после чего в левой части напишет первую часть, а в правой — вторую.
Обе части рапорта записываются аналогично, каждая на своей части рулона. Одна буква слова занимает ровно одну клетку. Первое слово записывается в первой строке рулона, начиная с самой левой клетки этой части рулона. Каждое следующее слово, если это возможно, должно быть записано в той же строке, что и предыдущее, и быть отделено от него ровно одной пустой клеткой.
Иначе, оно пишется в следующей строке, начиная с самой левой клетки. Если ширина части рулона меньше, чем длина какого-то слова, которое должно быть написано в этой части, написать эту часть рапорта на части рулона такой ширины невозможно.
Гарантируется, что можно провести вертикальную черту так, что обе части рапорта возможно написать. Верс хочет провести вертикальную черту так, чтобы длина рулона, которой хватит, чтобы написать рапорт, была минимальна. Помогите ей найти эту минимальную длину.
 
Входные данные: 
- в первой строке даны три целых числа w, n и m — ширина рулона, количество слов в первой и второй части рапорта (\(1 <= w <= 10^9\); \(1 <= n, m <= 100 000\));
- в следующей строке дано n целых чисел ai — длина i-го слова первой части рапорта \(1 <= a_i <= 10^9\);
- в следующей строке дано m целых чисел bj — длина j-го слова второй части рапорта \(1 <= b_j <= 10^9\).
Гарантируется, что возможно провести черту так, что обе части рапорта возможно написать.

Входные данные: в единственной строке выведите одно целое число — минимальную длину рулона, которой достаточно, чтобы написать рапорт.
 
Примеры
Входные данные Выходные данные
1
15 6 6
2 2 2 3 2 2
3 3 5 2 4 3
3

Примечание
В тесте из примера рулон можно разделить на две части, проведя черту между 7 и 8 столбцом клеток, а затем записать по два слова в каждой строке в обеих частях рапорта.
33228#33228
В одной из деревень Центрального района решили построить новую школу, но никак не могут выбрать, в какой именно. Решили сделать так: подсчитать для каждой деревни суммарное расстояние, которое будут проходить все школьники Центрального района, если школа будет построена в этой деревне, и выбрать место, для которого эта сумма будет минимальной. В распоряжении администрации есть карта дорог Центрального района. Напишите программу, которая поможет выбрать место для школы. Если какой-то населенный пункт не имеет связи с другим населенным пунктом, где предполагается разместить школу, считайте, что доставка каждого ученика вертолётом "стоит" 10000 единиц расстояния.
 
Входные данные
В первой строке вводится количество деревень N ( 1 ≤ N ≤ 100 ). В следующих N строках записано по N чисел, разделённых пробелами – элементы весовой матрицы графа, который описывает схему дорог: положительное число означает расстояние между деревнями, ноль говорит о том, что дороги нет. В последней строке вводится N чисел - количество школьников в каждой деревне.
 
Выходные данные
Программа должна вывести два числа: сначала номер деревни, где нужно построить школу, а затем (через пробел) – общее расстояние, которое будут проходить все школьники Центрального района, если школа будет построена в этой деревне.

Ввод Вывод
4
0 11 8 4
11 0 2 5
8 2 0 13
4 5 13 0
15 26 30 12
2 255

На далекой планете Тау Кита есть непонятные нам обычаи. Например, таукитяне очень необычно для землян выбирают имена своим детям. Родители так выбирают имя ребенку, чтобы оно могло быть получено как удалением некоторого набора букв из имени отца, так и удалением некоторого набора букв из имени матери. Например, если отца зовут «abacaba», а мать — «bbccaa», то их ребенок может носить имена «a», «bba», «bcaa», но не может носить имена «aaa», «ab» или «bbc». Возможно, что имя ребенка совпадает с именем отца и/или матери, если оно может быть получено из имени другого родителя удалением нескольких (возможно, ни одной) букв.
 
Пусть отец по имени X и мать по имени Y выбирают имя своему новорожденному ребенку. Так как в таукитянских школах учеников часто вызывают к доске в лексикографическом порядке имен учеников, то есть в порядке следования имен в словаре, то они хотят выбрать своему ребенку такое имя, чтобы оно лексикографически следовало как можно позже.
 
- Формально, строка S лексикографически больше строки T, если выполняется одно из двух условий: строка T получается из S удалением одной или более букв с конца строки S;
- первые (i - 1) символов строк T и S не различаются, а буква в i-й позиции строки T следует в алфавите раньше буквы в i-й позиции строки S.

Требуется написать программу, которая по именам отца и матери находит лексикографически наибольшее имя для их ребенка.
 
Входные данные
Первая строка входного файла содержит X — имя отца. Вторая строка входного файла содержит Y — имя матери. Каждое имя состоит из строчных букв латинского алфавита, включает хотя бы одну букву и имеет длину не более 105 букв.
 
Выходные данные
Выходной файл должен содержать искомое лексикографически наибольшее из возможных имен ребенка. В случае, если подходящего имени для ребенка не существует, выходной файл должен быть пустым.
 
Ввод Вывод
abcabca
abcda
ca
ccba
accbbaa
ccba
На одном из московских вокзалов билеты продают N касс. Каждая касса работает без перерыва определенный промежуток времени по фиксированному расписанию (одному и тому же каждый день). Требуется определить, на протяжении какого времени в течение суток работают все кассы одновременно.
 
Входные данные
Сначала вводится одно целое число N (0<N<=10000).
 
В каждой из следующих N строк через пробел расположены 6 целых чисел, первые три из которых обозначают время открытия кассы в часах, минутах и секундах (часы — целое число от 0 до 23, минуты и секунды — целые числа от 0 до 59), оставшиеся три — время закрытия в том же формате. Числа разделены пробелами.
 
Время открытия означает, что в соответствующую ему секунду касса уже работает, а время закрытия — что в соответствующую секунду касса уже не работает. Например, касса, открытая с 10 ч 30 мин 30 с до 10 ч 35 мин 30 с, ежесуточно работает 300 секунд.
 
Если время открытия совпадает с временем закрытия, то касса работает круглосуточно. Если первое время больше второго, то касса начинает работу до полуночи, а заканчивает — на следующий день.
 
Выходные данные
Требуется вывести одно число — суммарное время за сутки (в секундах), на протяжении которого работают все N касс.
 
Ввод Вывод
3
1 0 0 23 0 0
12 0 0 12 0 0
22 0 0 2 0 0
7200
2
9 30 0 14 0 0
14 15 0 21 0 0
0
2
14 0 0 18 0 0
10 0 0 14 0 1
1
В лицее на уроках информатики ответы учеников оцениваются целым числом баллов от 2 до 5. Итоговая оценка по информатике выставляется как среднее арифметическое оценок на всех уроках, округленное до ближайшего целого числа. Если среднее значение находится ровно посередине между двумя целыми числами, то оценка округляется вверх.
Примеры округления оценок приведены в таблице.
 
Оценки на уроках Среднее арифметическое Итоговая оценка
2, 3, 5 \({ {2 + 3 + 5} \over 3 }= 3 {1 \over 3}\) 3
3, 3, 4, 4 \({ {3 + 3 + 4 + 4} \over 4 }= 3 {1 \over 2}\) 4
5, 5, 5, 3, 5 \({ {5 + 5 + 5 + 3 + 5} \over 5 }= 4 {3 \over 5}\) 5
 
Все ученики лицея стремятся получить итоговую оценку по информатике не ниже 4 баллов. К сожалению, один из учеников получил на уроках a двоек, b троек и c четверок.Теперь он планирует получить несколько пятерок, причем хочет, чтобы итоговая оценка была не меньше 4 баллов. Ему надо понять, какое минимальное количество пятерок ему необходимо получить, чтобы добиться своей цели.
Требуется написать программу, которая по заданным целым неотрицательные числам a, b и c определяет минимальное количество пятерок, которое необходимо получить ученику, чтобы его итоговая оценка по информатике была не меньше 4 баллов.

Входные данные
Входные данные содержат три строки. Первая строка содержит целое неотрицательное число a, вторая строка содержит целое неотрицательное число b, третья строка содержит целое неотрицательное число c (0 ≤ a, b, c ≤ 1015, a + b + c ≥ 1).

Выходные данные
Выходные данные должны содержать одно число: минимальное число пятерок, которое необходимо получить ученику, чтобы итоговая оценка была не меньше 4 баллов.
 
Ввод Вывод
2
0
0
2






 
Однажды на огород к Ивану Петровичу (сыну Деда Мороза и Снегурочки) забежало целых три оленя. Известно, что олени — весьма агрессивное нечто, особенно когда речь идет о борьбе за вкусную зелень. Поэтому каждый из трех оленей, заметив других козлов, замер на месте и начал наблюдать за оставшимися оленями: одним глазом за одним оленем, другим — за оленем номер 2. Естественно, для этого оленю нужно “косить” глазами.
Определите наибольший угол, на который пришлось “раскосить” глазами этим странным животным. Причём тут Иван Петрович и мы, и как олени “раскосили” глаза, мы в душе не знаем. Своего дилера мы не сдадим.
Программа получает на вход координаты трех точек, в которых стоят олени (сначала координаты первого оленя, затем — второго и третьего). Координаты — пара целых чисел, не превосходящих 104 по модулю.
 
Ввод Вывод
0 0 3 0 0 4 90.000000
(с) Манаев И., Кашукова М., 2018 г.
Ёж#33113
Тем временем Ёж решил покатать шары из снега. В итоге у него получилось N шариков с диаметрами a1, a2, … an, все они различны. Из них он хочет собрать как можно больше НОРМАЛЬНЫХ снеговиков. Нормальный снеговик состоит из трёх шаров, диаметр которых снизу вверх строго уменьшается. Сколько максимум снеговиком он сможет собрать?

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

(с) Манаев И., Кашукова М., 2018 г.
Задан вес E пустой копилки и вес F копилки с монетами. В копилке могут находиться монеты N видов, для каждого вида известна ценность Pi и вес Wi одной монеты. Найти минимальную и максимальную суммы денег, которые могут находиться в копилке.

Входные данные
В первой строке находятся числа E и (1 <= E <= F <= 10000). Во второй - число (1<= N <= 500). В следующих N строках - по два числа, Pi и Wi (1 <= Pi <= 50000, 1 <= Wi <= 10000). Все числа целые.

Выходные данные
Выводятся два числа через пробел - минимальная и максимальная суммы. Если копилка не может иметь точно заданный вес при условии, что она наполнена монетами заданных видов, - вывести "This is impossible.".
 
Покупатель хочет приобрести товар стоимостью S рублей. У него есть N банкнот номиналом P1, P2, ..., PN рублей. У продавца есть M банкнот номиналом Q1, Q2, ..., QM. рублей. Определите, смогут ли они рассчитаться.
 
Входные данные: 
- в первой строке задается сумма S;
- во второй строке - число N;
- в третьей строке  - N чисел P1, P2, ..., PN;
- в четвертой строке - число M;
- в пятой строке - M чисел Q1, Q2, ..., QM.
Количество банкнот у продавца и покупателя и их номиналы не превосходят 100.
 
Выходные данные: если продавец сможет рассчитаться с покупателем, выведите номиналы банкнот, которые покупатель отдает продавцу и которые он получает в качестве сдачи. Выводите число со знаком “+”, если банкноту соответствующего номинала покупатель отдает продавцу и со знаком “-”, если покупатель получает эту банкноту на сдачу. Номиналы банкнот разделяйте пробелом.
Если они не могут рассчитаться, выведите строку Impossible.
 

 

Примеры
Входные данные Выходные данные
1
10
3
3 9 14
2
6 2
-2 +9 +3
2
100
3
74 35 8
2
19 6
Impossible
Поделиться
Класснуть