26.04 Прочие прототипы
Готовиться с нами - ЛЕГКО!
Ошибка.
Попробуйте повторить позже
Задание выполняется с использованием прилагаемых файлов
Робот складывает монеты в ящики. Задача робота заполнить как можно большее количество ящиков монетами в
количестве штук. Роботу по конвейеру поступают корзины с монетами. В каждой корзине может быть от
до
монет. Известно, что робот может высыпать в ящик содержимое не более двух корзин. Корзина должна быть высыпана в
ящик полностью. Необходимо определить, сколько ящиков можно заполнить монетами так, чтобы в каждом из них было
ровно по
монет.
Входные данные
В первой строке записано число – количество корзин, в каждой из последующих
строк число
– количество
монет в каждой корзине.
Выходные данные
В ответе запишите одно число – количество ящиков, заполненными монетами.
Пример организации исходных данных во входном файле:
При таких исходных данных можно заполнить только ящика по
монет
+
и
+
. Ответ:
.
Решение 1 (Excel/LibreOffice)
Откроем текстовый документ, скопируем значения и перенесем их в Excel или LibreOffice.
Посчитаем корзины с определенным количеством монет, для этого заполним ячейки столбца цифрами от 1 до 99, и
воспользуемся функцией СЧЁТЕСЛИ. Запишем в ячейку
следующую формулу =СЧЁТЕСЛИ(A1:A10000;B1),
скопируем её на свободные клеточки столбца. Для удобства перенесем получившуюся таблицу на новый лист.
Разделим данные таблицы на два столбца, перенесем значения
:
во второй столбец и воспользуемся
настраиваемой сортировкой по убыванию. Посчитаем количество ящиков, которое можно сформировать. Для
этого выберем минимум из количества корзин, в которых содержится 1 и 99 монет или 2 и 98 монет и тд.
Заметим, что корзина с 50 монетами встречается четное количество раз, значит можно сформировать в два
раза меньше ящиков, чем общее количество корзин. Общее количество получившихся ящиков равно 4653.
Решение 2 (Python)
f = open("26.txt") n=int(f.readline()) array=[int(n) for n in f.readlines()] array.sort() counter = 0 for i in range(0, n - 1): for j in range(n - 1, i, -1): if (array[i] + array[j] == 100 and array[i] != 0 and array[j] != 0): counter += 1 array[j] = 0 break print(counter)
Ошибка.
Попробуйте повторить позже
Задание выполняется с использованием прилагаемых файлов
Робот складывает монеты в ящики. Задача робота заполнить как можно большее количество ящиков монетами в количестве 100 штук. Роботу по конвейеру поступают корзины с монетами. В каждой корзине может быть от 1 до 99 монет. Известно, что робот может высыпать в ящик содержимое не более двух корзин. Корзина должна быть высыпана в ящик полностью. Необходимо определить, сколько ящиков можно заполнить монетами так, чтобы в каждом из них было ровно по 100 монет.
Входные данные
В первой строке записано число N – количество корзин, в каждой из последующих N строк число K – количество монет в каждой корзине.
Выходные данные
В ответе запишите одно число – количество ящиков, заполненными 100 монетами.
Пример организации исходных данных во входном файле:
7
10
44
66
90
65
47
34
При таких исходных данных можно заполнить только 2 ящика по 100 монет 10 + 90 и 66 + 34. Ответ: 2.
Решение 1 (Excel/LibreOffice)
Откроем текстовый документ, скопируем значения и перенесем их в Excel или LibreOffice.
Посчитаем корзины с определенным количеством монет, для этого заполним ячейки столбца цифрами от 1 до 99, и
воспользуемся функцией СЧЁТЕСЛИ. Запишем в ячейку
следующую формулу =СЧЁТЕСЛИ(A1:A10000;B1),
скопируем её на свободные клеточки столбца. Для удобства перенесем получившуюся таблицу на новый лист.
Разделим данные таблицы на два столбца, перенесем значения
:
во второй столбец и воспользуемся
настраиваемой сортировкой по убыванию. Посчитаем количество ящиков, которое можно сформировать. Для
этого выберем минимум из количества корзин, в которых содержится 1 и 99 монет или 2 и 98 монет и тд.
Заметим, что корзина с 50 монетами встречается четное количество раз, значит можно сформировать в два
раза меньше ящиков, чем общее количество корзин. Общее количество получившихся ящиков равно 3845.
Решение 2 (Python)
f = open("26.txt") n=int(f.readline()) array=[int(n) for n in f.readlines()] array.sort() counter = 0 for i in range(0, n - 1): for j in range(n - 1, i, -1): if (array[i] + array[j] == 100 and array[i] != 0 and array[j] != 0): counter += 1 array[j] = 0 break print(counter)
Ошибка.
Попробуйте повторить позже
У вас есть кастрюля и (не более
) ингредиентов. Каждый ингредиент имеет параметр вещественного числа,
называемый значением, а значение
-го ингредиента
равно
(каждое не более
). Когда вы положите
в кастрюлю два ингредиента, они исчезнут и в результате образуется новый ингредиент. Значение нового ингредиента
будет равно
, где
и
- значения потребленных ингредиентов, и вы можете снова положить этот ингредиент в
кастрюлю. После того, как вы составите ингредиенты таким образом
раз, у вас получится один ингредиент. В
ответе запишите максимально возможную ценность этого ингредиента с точностью до сотых. В первой строке
файла
находится одно число
. В следующих
строках файла находится массив целых чисел
длины
(длина массива это есть количество содержащихся в нем элементов) по одному элементу в
строке.
Для получения ответа работает следующий жадный алгоритм: давайте делать каждый следующий новый
ингредиент из двух наименьших по значению ингредиентов. Проделаем эту операцию раз и получим
ответ
Почему это работает? Рассмотрим ситуацию, в которой мы кладем два ингредиента, которые образовались
из двух различных наборов ингредиентов: и
со значениями
и
соответственно, и для определенности
. Тогда ценность объединения
. Тогда если
и
,
тогда утверждается, что можно поменять последовательность ходов и собрать новый элемент состоящий из
объединения наборов, который будет иметь большую (строго говоря конечно неменьшую) ценность. Давайте
просто напросто посмотрим на последнюю операцию из которой получился первый набор
и не будем
её делать, получим два каких то элемента. Пусть значения этих элементов
и
, и
. Тогда мы
знаем, что
. Теперь у нас есть три элемента со значениями
. Отсортируем их. Так как
, а
значит
. Теперь соединим элементы с ценностью
и
, а потом
получившийся с элементом со значением
. Итого ценность нового элемента составит
вместо
.
Очевидно, что разница в значениях есть . Руководствуясь такой логикой можем получить, что каждый ход, это
соединение унарного(то есть данного изначально по условию) ингредиента и того, который собран из множества
ингредиентов. Тогда чем позже изначальный элемент был смешан, тем на меньшую степень
будет поделена его
ценность, поэтому чем больше ценность элемента тем позже его следует добавлять
Решение на Python:
f = open(’26.txt’) n = int(f.readline()) a = [int(x) for x in f] a.sort() ans = a[0] for i in range(1, n): ans = (ans + a[i]) / 2 print(ans)
Ошибка.
Попробуйте повторить позже
У Креветкоеда большая коллекция креветок разных размеров. Каждая креветка имеет размер равный целому числу от
до
(не более
) включительно. У него есть
(каждое не более
) креветок размера
. Две креветки
могут образовать пару, если абсолютное значение разности их размеров составляет не более
. Креветкоед
хочет создать максимальное количество пар из своих креветок при условии, что ни одна креветка не должна
использоваться в нескольких парах. Найдите максимальное количество пар, которые он может создать и
съесть.
В первой строке файла вам дано число
, а в следующих
строках того же файла
целых чисел
Во-первых, предположим, что не существует такого , чтобы
. В этом случае мы можем доказать, что ответ всегда
, где
— общее количество креветок.
Доказательство заключается в следующем. Очевидно, что мы не можем сделать больше, чем пары. С другой
стороны, мы можем в явном виде построить
пары следующим алгоритмом: Пусть
— все креветки,
отсортированные в порядке неубывания. Тогда для каждого
:
(в противном случае нет креветки с целым
числом
, что является противоречием). Таким образом, мы можем построить
пары
.
Таким образом, мы можем сделать
пары.
Когда для некоторого
, вы не можете использовать карты с целым числом
, поэтому вы можете разделить
последовательность на
, и для каждой части вы можете решить задачу независимо (ответ — сумма этих независимых
задач).
На самом деле можно даже не делать сплит по . Достаточно лишь посмотреть при рассмотрении креветок размера
,
не осталась ли у вас ровно
креветка размера
. Следовательно, вы можете разделить последовательность
, по
, и для каждой части вычислить половину (с округлением дробной части в меньшую сторону) суммы, и ответом будет
сумма этих чисел. Асимптотика решения
.
Решение на C++
void solve(){ int n; cin >> n; vector<int> a(n); for(int i = 0; i < n; ++i){ cin >> a[i]; } long long ans = 0; ans += a[0] / 2; a[0] -= 2 * ans; for(int i = 1; i < n; ++i){ if(a[i - 1] > 0){ if(a[i] > 0){ --a[i]; ++ans; } } ans += a[i] / 2; a[i] -= a[i] / 2 * 2; } cout << ans << ’\n’; }
Решение на Python
f = open("26.txt") n = int(f.readline()) a = [int(f.readline()) for _ in range(n)] ans = 0 for i in range(n - 1): if a[i] >= a[i + 1]: ans += a[i + 1] a[i] -= a[i + 1] a[i + 1] = 0 ans += a[i] // 2 a[i] = a[i] % 2 else: ans += a[i] a[i + 1] -= a[i] a[i] = 0 ans += a[i + 1] // 2 a[i + 1] = a[i + 1] % 2 print(ans)
Ошибка.
Попробуйте повторить позже
Задание выполняется с использованием прилагаемых файлов
Компания по разработке игр открыла набор на работу в офис. На просторах сайта (сайт не уточняется) расположены резюме по поиску работы в сфере разработки игр. Среди них HR-менеджер Петров Влад обязан отобрать только высококвалифицированных и продуктивных программистов, которые смогут справиться со всеми задачами в их компании. При отборе Влад смотрит на КПД (сводка по образованию, опыту работы в данной сфере, качество портфолио). КПД должен составлять более 93 %. Известен КПД каждого соискателя.
По заданной информации о КПД соискателя и о количестве вакантных мест в компании определите максимальное количество потенциальных работников, КПД которых выше 93 %, а также максимальное КПД работника, найденного в таблице при условии, что найдено максимальное количество высококвалифицированных программистов.
В первой строке входного файла находятся два числа: S — количество вакантных мест (натуральное число, не
превышающее 1000) и N — количество соискателей (натуральное число, не превышающее 10000). В следующих N строках
находятся значения о КПД каждого соискателя (все числа натуральные, удовлетворяющие условию: ),
каждое в отдельной строке
Запишите в ответе два числа: сначала максимальное количество потенциальных работников, КПД которых выше 93 %, а также максимальное КПД работника, найденного в таблице при условии, что найдено максимальное количество высококвалифицированных программистов. Пример входного файла:
5 10
30
97
45
65
89
94
93
95
70
78
При таких исходных данных можно заполнить только 3 вакантных места. Эти люди со следующим КПД: 97, 95, 94. А максимальное КПД соискателя равно 97%. Таким образом, ответ для вышеприведенного примера будет: 3 97.
Решение 1 ( Excel / LibreOffice):
Откроем текстовый документ, скопируем значения и перенесем их в Excel или LibreOffice.
Перенесем числовые значения количества вакантных мест и количества соискателей, где они нам не помешают. Сортируем
числа по возрастанию. Выделяем 500 элементов, начиная с первого, числовое значение которого больше 93. Мы
получили, что количество вакантных мест больше, чем количество подходящих нам соискателей. Запишем
полученное количество подходящих соискателей и элемент, имеющий максимальное числовое значение, в ответ.
Решение 2 (Python):
f = open(’26.txt’) S, N = map(int, f.readline().split()) a = [] for i in range(N): a.append(int(f.readline())) a.sort(reverse=True) ans = [] for i in range(S): if a[i] > 93: ans.append(a[i]) print(len(ans), a[0])
Ошибка.
Попробуйте повторить позже
Каждую дробь можно представить в виде суммы уникальных единичных дробей (т.е. таких дробей, где в числителе стоит
, а в знаменатале уникальное число). Например,
Такое представление называется египетской дробью,
поскольку оно использовалось древними египтянами.
Определите, как можно представить дробь в виде суммы уникальных единичных дробей. В качестве ответа
запишите дроби через знак "+". Например, для дроби
в качестве ответа нужно указать
(В формате: Дробь,
пробел, плюс, пробел, дробь).
def egyptianFraction(nr, dr): print("The Egyptian Fraction " + "Representation of {0}/{1} is". format(nr, dr), end="\n") ef = [] while nr != 0: x = dr // nr + (dr % nr != 0) ef.append(x) nr = x * nr - dr dr = dr * x for i in range(len(ef)): if i != len(ef) - 1: print("1/{0} +".format(ef[i]), end=" ") else: print("1/{0}".format(ef[i]), end="") egyptianFraction(15, 23)
Ошибка.
Попробуйте повторить позже
Как известно, во время проведения всетибетской олимпиады по морфемике требуются наблюдатели. Известно, что время
начала олимпиады — и время окончания —
, то есть время проведения олимпиады — это полуинтервал
. Среди студентов вуза, принимающего олимпиаду был составлен список из
студентов-волонтеров, которые
смогут наблюдать за учениками и времена
и
, с которого и по которое они смогут проводить наблюдение
(полуинтервал
).
Требуется оторвать от учебы как можно меньше студентов-волонтеров, чтобы в каждый момент олимпиады за учениками присматривал хотя бы один студент, при этом смена первого студента-волонтера произошла как можно позже, с момента старта олимпиады. Важно чтобы данный состав наблюдателей смог проконтролировать проведение олимпиады.
Входные данные
В первой строке содержится три натуральных числа — количество наблюдателей , время начала олимпиады —
и время окончания —
, то есть время проведения олимпиады — это полуинтервал
.
В последующих строках содержится два числа —
, где
— время начала,
— время окончания работы
наблюдателя, то есть наблюдатель работает в течение полуинтервала
.
Выходные данные
Программа должна вывести в ответе два числа — минимальное количество наблюдателей, которое в состоянии проконтролировать олимпиаду, и время работы первого наблюдателя с момента начала олимпиады.
Пример входных данных:
Наблюдение полностью обеспечивают наблюдатели, работающие в полуинтервалы . Время работы
первого наблюдателя с начала экзамена
. Ответ:
f = open(’27b.txt’) n, begin, end = map(int, f.readline().split()) data = sorted([[int(i) for i in f.readline().split()] for i in range(n)]) diff = 0 maxim = 0 ans = 0 time = 0 # проходим по списку наблюдателей for i in range(n): # если время начала работы наблюдателя меньше или равно времени начала олимпиады if data[i][0] <= begin: # и если время окончания работы наблюдателя больше времени начала олимпиады if data[i][1] > begin: # и если разница между временем окончания работы наблюдателя и временем начала олимпиады больше текущей разницы if data[i][1] - begin > diff: # обновляем разницу и время окончания работы первого наблюдателя diff = data[i][1] - begin maxim = data[i][1] # если время начала работы наблюдателя больше времени начала олимпиады else: # и если еще не был назначен ни один наблюдатель if ans == 0: # вычисляем время работы первого наблюдателя time = maxim - begin # обновляем начало олимпиады, разницу и количество наблюдателей begin = maxim diff = 0 ans += 1 # если олимпиада закончилась, прерываем цикл if maxim >= end: break print(ans, time)