Алгоритмы

2 280 задачвместе с подтемами
Число у задачи — рейтинг сложности, слово рядом — насколько она трудна по сравнению с другими задачами такого же типа. Шкалы задач с ответом и задач с кодом между собой не сравниваются. Рядом — счётчики попыток: успешные, неуспешные.
Дано N отрезков провода длиной L1, L2, ..., LN сантиметров. Требуется с помощью разрезания получить из них K равных отрезков как можно большей длины, выражающейся целым числом сантиметров. Если нельзя получить K отрезков длиной даже 1 см, вывести 0.
 
Ограничения: 1 <= N <= 10 000, 1 <= K <= 10 000, 100 <= Li <= 10 000 000, все числа целые.

Программа должна работать быстрее, чем за линейный поиск
 
Входные данные
В первой строке находятся числа N и К. В следующих N строках - L1, L2, ..., LN, по одному числу в строке.
 
Выходные данные
Вывести одно число - полученную длину отрезков.
 
Фермер Николай нанял двух лесорубов: Дмитрия и Федора, чтобы вырубить лес, на месте которого должно быть кукурузное поле. В лесу растут X деревьев.
 
Дмитрий срубает по A деревьев в день, но каждый K-й день он отдыхает и не срубает ни одного дерева. Таким образом, Дмитрий отдыхает в K-й, 2K-й, 3K-й день, и т.д.
 
Федор срубает по B деревьев в день, но каждый M-й день он отдыхает и не срубает ни одного дерева. Таким образом, Федор отдыхает в M-й, 2M-й, 3M-й день, и т.д.
 
Лесорубы работают параллельно и, таким образом, в дни, когда никто из них не отдыхает, они срубают A + B деревьев, в дни, когда отдыхает только Федор — A деревьев, а в дни, когда отдыхает только Дмитрий — B деревьев. В дни, когда оба лесоруба отдыхают, ни одно дерево не срубается.
 
Фермер Николай хочет понять, за сколько дней лесорубы срубят все деревья, и он сможет засеять кукурузное поле. 
 
Требуется написать программу, которая по заданным целым числам A, K, B, M и X определяет, за сколько дней все деревья в лесу будут вырублены.

Программа должна работать быстрее, чем за линейный поиск
 
Входные данные
Входной файл содержит пять целых чисел, разделенных пробелами: A, K, B, M и X (1 ≤ A, B ≤ 109 , 2 ≤ K, M ≤ 1018, 1 ≤ X ≤ 1018).
 
Выходные данные
Выходной файл должен содержать одно целое число — искомое количество дней.

Ввод Вывод
2 4 3 3 25 7

Сегодня утром жюри решило добавить в вариант олимпиады еще одну, Очень Легкую Задачу. Ответственный секретарь Оргкомитета напечатал ее условие в одном экземпляре, и теперь ему нужно до начала олимпиады успеть сделать еще N копий. В его распоряжении имеются M ксероксов, каждый из которых копирует лист за х секунд. (Разрешается использовать все ксероксы одновременно. Можно копировать не только с оригинала, но и с копии.) Помогите ему выяснить, какое минимальное время для этого потребуется.

Программа должна работать быстрее, чем за линейный поиск


Формат входных данных
В первой строке записаны да натуральных числа N, M  разделенные пробелом (1 ≤ N, M ≤ 2108), во второй строке записаны скорости всех ксероксов - x (1 ≤ x ≤ 10 )


Формат выходных данных
Выведите одно число – минимальное время в секундах, необходимое для получения N копий.
 
Ввод Вывод
8 3
2 3 7
9
Дан набор гирь массой1, …, mN. Можно ли их разложить на две чаши весов, чтобы они оказались в равновесии?
 
Входные данные:
- в первой строке вводится натуральное число N, не превышающее 100;
- во второе строке вводятся N натуральных чисел mi, не превышающих 100.
 
Выходные данные: выведите YES или NO.
 

 

Примеры
Входные данные Выходные данные
1 1
17
NO
2 2
19 19
YES
Дано N предметов массой m1, …, mN. Ими наполняют рюкзак, который выдерживает вес не более M. Как набрать вес в точности M, используя как можно меньше предметов?
 
Входные данные:
- в первой строке вводится натуральное число N, не превышающее 100 и натуральное число M, не превышающее 10000;
- во второе строке вводятся N натуральных чисел mi, не превышающих 100.
 
Выходные данные: выведите наименьшее необходимое число предметов или 0, если набрать данный вес невозможно.
 

 

Примеры
Входные данные Выходные данные
1
1 5968
18
0
Дано N золотых слитков массой m1, …, mN. Ими наполняют рюкзак, который выдерживает вес не более M. Какую наибольшую массу золота можно унести в таком рюкзаке?
 
Входные данные: 
- в первой строке вводится натуральное число N, не превышающее 100 и натуральное число M, не превышающее 10000;
- во второй строке вводятся N натуральных чисел mi, не превышающих 100.
 
Выходные данные: выведите одно целое число - наибольшую возможную массу золота, которую можно унести в данном рюкзаке.
 

 

Примеры
Входные данные Выходные данные
1
2 3195
38 41
79
Дано N предметов массой m1, …, mN и стоимостью c1, …, cN соответственно. 
Ими наполняют рюкзак, который выдерживает вес не более M. Определите набор предметов, который можно унести в рюкзаке, имеющий наибольшую стоимость.
 
Входные данные: 
- в первой строке вводится натуральное число N, не превышающее 100 и натуральное число M, не превышающее 10000;
- во второй строке вводятся N натуральных чисел mi, не превышающих 100;
- в третьей строке вводятся N натуральных чисел сi, не превышающих 100.
 
Выходные данные: выведите номера предметов (числа от 1 до N), которые войдут в рюкзак наибольшей стоимости (по одному номеру в строке).
 

 

Примеры
Входные данные Выходные данные
1
4 6
2 4 1 2
7 2 5 1
1
3
4
Маленькому Арсению на кружке по системам счисления задали следующую задачу: перевести число X в системе счисления s1 в систему счисления s2. Недолго думая, он позвал на помощь своего лучшего друга Добрыню, который славился тем, что замечательно умел считать до 10 на пальцах. После нескольких бессонных ночей ребята общими усилиями справились с задачей.
 
Однако, на следующем занятии Арсению задали похожую задачу, где X, к сожалению, превышало 10. Тогда ребята решили обратиться в Летнюю Компьютерную Школу с просьбой написать универсальную программу, которая решает задачу для любых X, s1 и s2. Ваша цель – выполнить просьбу Арсения и Добрыни.
 
Входные данные
Во входных данных вашей программе дается 3 числа: исходное число X, основания систем счисления s1 и s2 (\(2  <=  s1,\ s2  <=  10\)). Число X в десятичной системе счисления не превышает \(2 \cdot 10^9\).
 
Выходные данные
В выходных данных должно находиться одно число, равное числу X в системе счисления s2, или -1, если входные данные некорректны.

 

 

Примеры
Входные данные Выходные данные
1 101 2 10 5
2 200 2 10 -1


 
На плоскости задано N прямоугольников с вершинами в точках с целыми координатами и сторонами, параллельными осям координат. Необходимо найти площадь их объединения.
 
Входные данные
В первой строке входного файла указано число N (0N1500). В следующих N строках заданы по 4 целых числа x1, y1, x2, y2 — сначала координаты левого нижнего угла прямоугольника, потом правого верхнего (0x1x2109, 0y1y2109). Обратите внимание, что прямоугольники могут вырождаться в отрезки и даже в точки.
 
Выходные данные
В выходной файл выведите единственное число — ответ на задачу.
 
Ввод Вывод
3
1 1 3 5
5 2 7 4
2 4 6 7
23
2
0 0 2 2
1 3 2 4
5
На прямой задано некоторое множество отрезков с целочисленными координатами концов \([L_i, R_i]\). Выберите среди данного множества подмножество отрезков, целиком покрывающее отрезок \([0, M]\), (M — натуральное число), содержащее наименьшее число отрезков.
 
Входные данные
В первой строке указана константа M (\(1<=M<=5000\)). В каждой последующей строке записана пара чисел Li и Ri (\(|L_i|,|R_i| < 50000\)), задающая координаты левого и правого концов отрезков. Список завершается парой нулей. Общее число отрезков не превышает 100 000.
 
Выходные данные
В первой строке выходного файла выведите минимальное число отрезков, необходимое для покрытия отрезка \([0; M]\). Далее выведите список покрывающего подмножества, упорядоченный по возрастанию координат левых концов отрезков. Список отрезков выводится в том же формате, что и во входe. Завершающие два нуля выводить не нужно. Если покрытие отрезка \([0; M]\) исходным множеством отрезков \([L_i, R_i]\) невозможно, то следует вывести единственную фразу “No solution”.

 

Примеры
Входные данные Выходные данные
1
1
-1 0
-5 -3
2 5
0 0
No solution
2
1
-1 0
0 1
0 0
1
0 1
В магазине проходит новогодняя распродажа – цены всех товаров снижены на 25 %. Оказалось, что первоначально все цены делились на 4, поэтому после снижения цен все цены также выражаются целым числом. Товаровед вечером перед распродажей снял ценники со всех товаров и напечатал для каждого товара ещё один ценник со сниженной ценой. Он оставил все ценники на столе, рассчитывая утром их развесить. Но, придя утром в магазин, он обнаружил, что уборщица смешала все ценники вместе, и теперь ему нужно отделить старые ценники от новых.
Помогите ему решить эту задачу. 
 

Входные данные
Первая строка входных данных содержит общее количество ценников N, 2 <= N <= 105, N – чётное число. Следующие N строк содержат целые положительные числа, не превосходящие 109, идущие в порядке неубывания по одному в строке – числа, записанные на всех ценниках (как старых, так и новых). Гарантируется, что входные данные корректны,то есть решение существует.

Выходные данные
Программа должна вывести N/2  целых чисел в порядке неубывания – стоимости товаров после понижения цен.

 
Примеры
Входные данные Выходные данные Примечание
1
6
30
40
42
45
56
60
30
42
45
До распродажи цены товаров были 40, 56, 60, после снижения цены
на эти товары стали равны 30, 42, 45.
Для исполнения большого танца в круг выстроилось N танцоров (N чётное). Пронумеруем танцоров числами от 1 до N начиная от подиума по часовой стрелке. На каждом шаге танца танцоры разбиваются на пары (пару образуют два соседних по кругу танцора), и танцоры в паре меняются местам, причём на первом и всех последующих нечётных шагах танцор, стоящий в начале круга, образует пару с танцором, стоящим рядом с ним по часовой стрелке. Также пару образуют два танцора, следующие за ними по часовой стрелке, и т. д. На втором шаге и всех шагах с чётными номерами танцор, стоящий в начале
круга, образует пару с танцором, стоящим рядом с ним против часовой стрелки. Два танцора, следующие за ними против часовой стрелки, также образуют пару и т. д. 
 
На рисунке изображена начальная расстановка для N = 6 танцоров и два следующих шага танца. Расположение подиума отмечено точкой.
Определите, кто будет стоять рядом с танцором номер P через K шагов.

Программа получает на вход три целых числа N, P, K, записанные в отдельных строках. Первое число N – количество танцоров в кругу, N чётное. Второе число P – номер танцора, 1 ≤ P ≤ N. Третье число K – количество сделанных шагов после начала танца, 1 ≤ K. Максимальные значения для N и K <= 109
 
Программа должна вывести два целых числа в порядке возрастания – номера танцоров, которые будут стоять рядом с танцором номер P после K шагов танца.


 
Ввод Вывод Примечание
6
5
2
2 4 Рисунок выше соответствует этому примеру.
Дана правильная рациональная несократимая дробь a / b. С этой дробью выполняется следующая операция: к числителю и знаменателю дроби прибавляется 1, после чего дробь сокращается. Определите, можно ли при помощи таких операций из дроби a / b получить другую правильную дробь c / d.

Программа получает на вход четыре целых числа a, b, c, d, причём 0 < a < b ≤ 105, 0 < с < d ≤ 105, числа a и b взаимно простые, числа с и d взаимно простые, a / b ≠ c / d.
Программа должна вывести одно натуральное число – сколько описанных операций нужно применить, чтобы из дроби a / b получить дробь с / d. Если это сделать невозможно, программа должна вывести число 0.

Ввод Вывод Примечание
1
3
2
3
 
2
Дана дробь 1 / 3. После первой операции получается дробь
2 / 4, которая сокращается до 1 / 2. После второй операции
получается дробь 2 / 3.
2
3
1
3
0
Получить из дроби 2 / 3 дробь 1 / 3 невозможно.
 
 
На автобусных билетах указываются их номера. Номера всех билетов всегда записываются при помощи одного и того же количества цифр, при этом число используемых цифр чётно. При необходимости числа дополняются ведущими нулями. К примеру, если для записи используют 4 цифры, то 514 будет записано как 0514. Билеты отпечатаны на лентах, билеты на каждой ленте нумеруются подряд числами от 00...01 до 99...99.
Счастливым считается тот билет, у которого сумма цифр первой половины равна сумме цифр второй половины, например, билеты 1001 и 123051 счастливые, а 7778 и 39 – нет. Сегодня Дима зашел в автобус, и кондуктор выдал ему билет с номером N. Поскольку Диме ехать достаточно долго, а заняться чем-нибудь надо, он стал думать, какой номер будет иметь следующий счастливый билет, выданный из той же ленты, что и Димин билет. Если в текущей ленте не осталось счастливых билетов, Диму интересует номер минимального счастливого билета из новой ленты.

В первой и единственной строке входного файла содержится номер Диминого билета N, записанный с ведущими нулями. Количество цифр в записи числа N не превосходит 100 000 и чётно.

Программа должа вывести номер следующего счастливого билета из текущей ленты в таком же формате. Если такого билета не существует, надо вывести номер минимального счастливого билета из новой ленты. В выводе не должно быть пробелов, пустых строк в начале вывода.
 
Ввод Вывод Примечание
0514 0523 Диме был выдан счастливый билет (сумма цифр обеих половин равна 5), но Диму не интересует номер его билета, его интересует номер следующего счастливого билета.


 
 
В MMORPG "Космические торговцы online" скорость перемещения игрока между звёздами ограничена одним парсеком в секунду. С такой скоростью можно быстро добраться до ближайших звёзд, но на путешествие с одного края галактики до другого может потребоваться несколько часов. Для ускорения таких долгих путешествий создатели игры сделали несколько "кротовых нор" — туннелей, соединяющих две точки в пространстве, которые позволяют мгновенно перемещаться между этими точками туда и обратно.

Напишите программу, которая вычисляет минимальное время путешествия, используя информацию о "кротовых норах".

В первой строке ввода содержится целое число N (1 ≤ N ≤ 100). Далее следует строка, содержащая 6 целых чисел — координаты начальной (xs,ys,zs) и конечной (xt,yt,zt) точки путешествия. Далее следует N строк, содержащих 6 целых чисел — координаты концов "кротовых нор". Все координаты измеряются в парсеках и находятся в диапазоне от 0 до 10000, и нет точек с совпадающими координатами.

Вывести минимальное время путешествия в секундах с точностью не менее 10−6.
Примеры
Входные данные Выходные данные
1
1
0 0 0 100 100 0
1 1 1 50 100 10
52.722246
Дано натуральное число N. Необходимо определить следующее за ним число, в двоичном разложении которого столько же единиц, сколько в двоичном разложении числа N.
 
Входные данные
Входные данные содержит одно натуральное число N (\(N <= 2^{30}\)).
 
Выходные данные
Выведите ответ на задачу.
 

 

Примеры
Входные данные Выходные данные
1 1 2
2 2 4
3 3 5
Для заданного натурального A найти минимальное натуральное N такое, что N в степени N (N, умноженное на себя N раз) делится на A.
 
Входные данные 
На вход подается единственное число A (\(1 <= A <= 10^9\)).
 
Выходные данные
Необходимо вывести единственное число N.
 
Примеры
Входные данные Выходные данные
1 8 4
2 13 13
Часы#32947
Наручные часы на электронных чернилах могут показывать текущее время в нескольких разных формах. Одна из форм - это имитация механических часов со стрелками. Циферблат часов разделен на 12 больших часовых делений, а каждое из них - на 5 малых делений. Угол между малыми делениями на циферблате равен 6. Для экономии энергии перерисовка изображения происходит один раз в минуту, когда необходимо переместить минутную стрелку. Часовая стрелка также движется дискретно, перемещаясь через каждые 12 минут на одно малое деление. Таким образом в 12:35 часовая стрелка будет указывать на 2-е малое деление справа от 12 часов, а минутная будет указывать на 7 часов. Угол между стрелками в этот момент равен 162º. В 12:36 часовая стрелка переместится на 3-е малое деление после 12 часов, а минутная — на следующее малое деление после 7 часов. Угол между стрелками часов при этом не изменится.

Напишите программу, которая вычисляет величину "внутреннего" (меньшего) угла между часовой и минутной стрелкой в заданный момент времени.
Первая строка ввода содержит два целых числа, разделенных одним пробелом — время на часах, часы H и минуты M (\(1 <= H <= 12, 0 <= M <= 59\)).
Вывести одно целое число в диапазоне от 0 до 180 — величину угла между стрелками в градусах.
 
Примеры
Входные данные Выходные данные
1 12 35 162
Президент Берляндии обратился к вам за помощью! В его стране есть n городов. Между некоторыми парами городов есть двусторонние дороги. Совсем скоро откроется туристический сезон, но дороги Берляндии совсем не готовы к такому испытанию.
Президент хочет отремонтировать некоторое множество дорог так, чтобы суммарная стоимость ремонта была минимальной и из любого города Берляндии можно было бы добраться до любого другого, пользуясь только отремонтированными дорогами.
Найти множество дорог, которые нужно отремонтировать, вам поможет ваш друг. Вам только требуется подсчитать минимальную стоимость ремонта.
Гарантируется, что всегда найдется необходимое множество дорог.

Входные данные:
В первой строке задано два целых числа - n и m (2 <= n <= 300000, n - 1  <= m <= 300000).
В следующих m строках содержатся три числа - u, v и w (1 <= u, v <= n, 0 <= w <= 109) - дорога между городами u и v, стоимость ремонта которой w.

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

(с) Ибрахим Ахмад, 2018

Для сборки компьютера необходимо T компонентов различного типа (видеокарта, жесткий диск, монитор и т.д.). В магазине продаются N компонентов. Каждый компонент относится к определенному типу и имеет некоторую стоимость и рейтинг по обзорам в журналах.
Напишите программу, определяющую из каких компонентов нужно собрать компьютер, чтобы его стоимость не превышала B, в составе были по одному компоненту каждого типа, а суммарный рейтинг использованных компонентов был максимальным.

Первая строка ввода содержит одно целое число – количество типов компонентов T (1 ≤ T ≤ 5). Вторая строка ввода содержит одно целое число – количество компонентов в магазине N (1 ≤ N ≤ 1000). Далее следует N строк, содержащих по три целых числа, разделенных пробелами – стоимость i-го компонента Ci (1 ≤ Ci ≤ 3000), его рейтинг Ri (1 ≤ Ri ≤ 3000) и его тип ti (1 ≤ ti ≤ T). Далее следует строка, содержащая одно целое число – бюджет на покупку компьютера B (1 ≤ B ≤ 3000).

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

Ввод Вывод
2
5
10 6 1
5 7 1
6 10 2
1 5 1
11 11 2
16
18
2 5

Поделиться
Класснуть