Тема 26. Программирование - Обработка целочисленной информации с использованием сортировки

26.04 Прочие прототипы

Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела программирование - обработка целочисленной информации с использованием сортировки
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 21#56571Максимум баллов за задание: 2

Задание выполняется с использованием прилагаемых файлов

Робот складывает монеты в ящики. Задача робота заполнить как можно большее количество ящиков монетами в количестве 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.
Посчитаем корзины с определенным количеством монет, для этого заполним ячейки столбца B  цифрами от 1 до 99, и воспользуемся функцией СЧЁТЕСЛИ. Запишем в ячейку C1  следующую формулу =СЧЁТЕСЛИ(A1:A10000;B1), скопируем её на свободные клеточки столбца. Для удобства перенесем получившуюся таблицу на новый лист. Разделим данные таблицы на два столбца, перенесем значения A51  :B99  во второй столбец и воспользуемся настраиваемой сортировкой по убыванию. Посчитаем количество ящиков, которое можно сформировать. Для этого выберем минимум из количества корзин, в которых содержится 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)

Ответ: 4653

Ошибка.
Попробуйте повторить позже

Задача 22#56572Максимум баллов за задание: 2

Задание выполняется с использованием прилагаемых файлов

Робот складывает монеты в ящики. Задача робота заполнить как можно большее количество ящиков монетами в количестве 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.
Посчитаем корзины с определенным количеством монет, для этого заполним ячейки столбца B  цифрами от 1 до 99, и воспользуемся функцией СЧЁТЕСЛИ. Запишем в ячейку C1  следующую формулу =СЧЁТЕСЛИ(A1:A10000;B1), скопируем её на свободные клеточки столбца. Для удобства перенесем получившуюся таблицу на новый лист. Разделим данные таблицы на два столбца, перенесем значения A51  :B99  во второй столбец и воспользуемся настраиваемой сортировкой по убыванию. Посчитаем количество ящиков, которое можно сформировать. Для этого выберем минимум из количества корзин, в которых содержится 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)

Ответ: 3845

Ошибка.
Попробуйте повторить позже

Задача 23#56687Максимум баллов за задание: 2

У вас есть кастрюля и N  (не более 50  ) ингредиентов. Каждый ингредиент имеет параметр вещественного числа, называемый значением, а значение i  -го ингредиента (1 ≤ i ≤ N )  равно vi  (каждое не более 1000  ). Когда вы положите в кастрюлю два ингредиента, они исчезнут и в результате образуется новый ингредиент. Значение нового ингредиента будет равно (x+ y)∕2  , где x  и y  - значения потребленных ингредиентов, и вы можете снова положить этот ингредиент в кастрюлю. После того, как вы составите ингредиенты таким образом N − 1  раз, у вас получится один ингредиент. В ответе запишите максимально возможную ценность этого ингредиента с точностью до сотых. В первой строке файла 26.txt  находится одно число N  . В следующих N  строках файла находится массив целых чисел v  длины N  (длина массива это есть количество содержащихся в нем элементов) по одному элементу в строке.

Вложения к задаче
Показать ответ и решение

Для получения ответа работает следующий жадный алгоритм: давайте делать каждый следующий новый ингредиент из двух наименьших по значению ингредиентов. Проделаем эту операцию N − 1  раз и получим ответ

Почему это работает? Рассмотрим ситуацию, в которой мы кладем два ингредиента, которые образовались из двух различных наборов ингредиентов: [v1,v2,v3...,vn]  и [u1,u2,u3,...,um]  со значениями a  и b  соответственно, и для определенности a >= b  . Тогда ценность объединения (a +b)∕2  . Тогда если n > 1  и m > 1  , тогда утверждается, что можно поменять последовательность ходов и собрать новый элемент состоящий из объединения наборов, который будет иметь большую (строго говоря конечно неменьшую) ценность. Давайте просто напросто посмотрим на последнюю операцию из которой получился первый набор [vi]  и не будем её делать, получим два каких то элемента. Пусть значения этих элементов x  и y  , и x >= y  . Тогда мы знаем, что x +y = 2∗ a  . Теперь у нас есть три элемента со значениями x,y,b  . Отсортируем их. Так как x >= y  , а x + y >= 2∗ a  значит x >= a >= b  . Теперь соединим элементы с ценностью y  и b  , а потом получившийся с элементом со значением x  . Итого ценность нового элемента составит y∕4+ (x+ b)∕2  вместо (x +y)∕4+ b∕2  .

Очевидно, что разница в значениях есть x∕2  . Руководствуясь такой логикой можем получить, что каждый ход, это соединение унарного(то есть данного изначально по условию) ингредиента и того, который собран из множества ингредиентов. Тогда чем позже изначальный элемент был смешан, тем на меньшую степень 2  будет поделена его ценность, поэтому чем больше ценность элемента тем позже его следует добавлять

Решение на 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)

 

Ответ: 911.28

Ошибка.
Попробуйте повторить позже

Задача 24#56688Максимум баллов за задание: 2

У Креветкоеда большая коллекция креветок разных размеров. Каждая креветка имеет размер равный целому числу от       1  до N  (не более 2 ⋅106  ) включительно. У него есть Ai  (каждое не более 103  ) креветок размера i  . Две креветки могут образовать пару, если абсолютное значение разности их размеров составляет не более 1  . Креветкоед хочет создать максимальное количество пар из своих креветок при условии, что ни одна креветка не должна использоваться в нескольких парах. Найдите максимальное количество пар, которые он может создать и съесть.

В первой строке файла 26.txt вам дано число N  , а в следующих N  строках того же файла N  целых чисел Ai.

Вложения к задаче
Показать ответ и решение

Во-первых, предположим, что не существует такого i  , чтобы Ai = 0  . В этом случае мы можем доказать, что ответ всегда S∕∕2  , где S  — общее количество креветок.

Доказательство заключается в следующем. Очевидно, что мы не можем сделать больше, чем S∕∕2  пары. С другой стороны, мы можем в явном виде построить S∕∕2  пары следующим алгоритмом: Пусть x1,...,xS  — все креветки, отсортированные в порядке неубывания. Тогда для каждого i  : xi+1 − xi ≤ 1  (в противном случае нет креветки с целым числом xi + 1  , что является противоречием). Таким образом, мы можем построить S∕∕2  пары (x1,x2),(x3,x4),...  . Таким образом, мы можем сделать S∕∕2  пары.

Когда Ai = 0  для некоторого i  , вы не можете использовать карты с целым числом i  , поэтому вы можете разделить последовательность на i  , и для каждой части вы можете решить задачу независимо (ответ — сумма этих независимых задач).

На самом деле можно даже не делать сплит по 0  . Достаточно лишь посмотреть при рассмотрении креветок размера        i  , не осталась ли у вас ровно 1  креветка размера i− 1  . Следовательно, вы можете разделить последовательность  Ai  , по 0  , и для каждой части вычислить половину (с округлением дробной части в меньшую сторону) суммы, и ответом будет сумма этих чисел. Асимптотика решения O (N )  .

Решение на 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)

Ответ: 24995271

Ошибка.
Попробуйте повторить позже

Задача 25#56689Максимум баллов за задание: 2

Задание выполняется с использованием прилагаемых файлов

Компания по разработке игр открыла набор на работу в офис. На просторах сайта (сайт не уточняется) расположены резюме по поиску работы в сфере разработки игр. Среди них HR-менеджер Петров Влад обязан отобрать только высококвалифицированных и продуктивных программистов, которые смогут справиться со всеми задачами в их компании. При отборе Влад смотрит на КПД (сводка по образованию, опыту работы в данной сфере, качество портфолио). КПД должен составлять более 93 %. Известен КПД каждого соискателя.

По заданной информации о КПД соискателя и о количестве вакантных мест в компании определите максимальное количество потенциальных работников, КПД которых выше 93 %, а также максимальное КПД работника, найденного в таблице при условии, что найдено максимальное количество высококвалифицированных программистов.

В первой строке входного файла находятся два числа: S — количество вакантных мест (натуральное число, не превышающее 1000) и N — количество соискателей (натуральное число, не превышающее 10000). В следующих N строках находятся значения о КПД каждого соискателя (все числа натуральные, удовлетворяющие условию: 1 ≤ X ≤ 100  ), каждое в отдельной строке

Запишите в ответе два числа: сначала максимальное количество потенциальных работников, КПД которых выше 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])

Ответ: 328 100

Ошибка.
Попробуйте повторить позже

Задача 26#59194Максимум баллов за задание: 2

Каждую дробь можно представить в виде суммы уникальных единичных дробей (т.е. таких дробей, где в числителе стоит 1  , а в знаменатале уникальное число). Например, 23 = 12 + 16.  Такое представление называется египетской дробью, поскольку оно использовалось древними египтянами.

Определите, как можно представить дробь 15
23  в виде суммы уникальных единичных дробей. В качестве ответа запишите дроби через знак "+". Например, для дроби 23  в качестве ответа нужно указать 1∕2+ 1∕6  (В формате: Дробь, пробел, плюс, пробел, дробь).

Показать ответ и решение
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)

Ответ: 1/2 + 1/7 + 1/108 + 1/17388

Ошибка.
Попробуйте повторить позже

Задача 27#60388Максимум баллов за задание: 2

Как известно, во время проведения всетибетской олимпиады по морфемике требуются наблюдатели. Известно, что время начала олимпиады — begin  и время окончания — end  , то есть время проведения олимпиады — это полуинтервал [begin,end)  . Среди студентов вуза, принимающего олимпиаду был составлен список из N  студентов-волонтеров, которые смогут наблюдать за учениками и времена a  и b  , с которого и по которое они смогут проводить наблюдение (полуинтервал [a,b)  ).

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

Входные данные

В первой строке содержится три натуральных числа — количество наблюдателей N  , время начала олимпиады — begin  и время окончания — end  , то есть время проведения олимпиады — это полуинтервал [begin,end)  .

В последующих N  строках содержится два числа — a,b  , где a  — время начала, b  — время окончания работы наблюдателя, то есть наблюдатель работает в течение полуинтервала [a,b)  .

Выходные данные

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

Пример входных данных:

5  2  10

1  4

1  3

3  8

7  10

10  11

Наблюдение полностью обеспечивают наблюдатели, работающие в полуинтервалы [1,4),[3,8),[7,10)  . Время работы первого наблюдателя с начала экзамена 4 − 2 = 2  . Ответ: 3  2

Вложения к задаче
Показать ответ и решение
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)

Ответ: 59 290
Рулетка
Вы можете получить скидку в рулетке!