Форум программистов, компьютерный форум, киберфорум
eaa
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  

Решение вступительных заданий schol.hh.ru 2022

Запись от eaa размещена 10.11.2022 в 07:28
Показов 3191 Комментарии 2

Задача 1. Розыгрыш резюме рьяными работниками

Ограничение времени, с 1
Ограничение памяти, МБ 64

У HR Маши на столе лежат две стопки резюме, размерами n и m, в каждом из резюме указана зарплата, числа a[0..n-1] для одной стопки, и b[0..m-1] для второй. Нулевой индекс указывает на верхнее резюме в стопке.

Маша устанавливает значение s максимальной суммы зарплат и предлагает очень активному стажеру Саше сыграть в игру:

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

Нужно выяснить, какое максимальное количество резюме Саша мог бы забрать себе в работу, если бы тоже знал зарплаты, указанные в каждом резюме.

Входные данные (поступают в стандартный поток ввода)
Первая строка – целые числа n, m и s через пробел (1≤n≤10 000, 1≤m≤10 000, 1≤s≤200 000 000)

Далее идут строки с зарплатами резюме в стопках. Всего строк столько, сколько резюме в большей из стопок, на каждой строке один из вариантов:

- два целых числа a и b через пробел (1≤a≤10 000, 1≤b≤10 000),
- a и символ - (если во второй стопке больше нет резюме) через пробел (1≤a≤10 000)
- символ - (если в первой стопке больше нет резюме) и b через пробел (1≤b≤10 000)
Все входные данные наших тестов всегда соблюдают указанные параметры, дополнительные проверки не требуются

Выходные данные (ожидаются в стандартном потоке вывода)
Одно целое число, максимальное количество резюме

Пример 1
Ввод:
3 4 11
1 1
2 2
3 3
- 4

Вывод:
5

Оптимальным алгоритмом здесь будет просто брать верхние резюме из каждой стопки 1 + 1 + 2 + 2 + 3 = 9. Дальше резюме брать нельзя, потому что сумма станет выше 10, поэтому возвращаем 5.

Пример 2
Ввод:

5 5 10
5 1
1 3
1 3
1 3
1 3

Вывод:
6

Здесь ситуация интереснее, и играет роль то, что Саша знает все зарплаты во всех резюме, оптимально для него будет взять сначала всю левую стопку по порядку 5 + 1 + 1 + 1 + 1 = 9, а потом взять еще верхнее резюме из правой 9 + 1 = 10. Итого 6 резюме.

Пример 3
Ввод:
6 4 10
4 2
2 1
4 8
6 5
1 -
7 -

Вывод:
4

Этот пример похож на первый, просто показывает, как выглядит ввод для ситуации, когда вторая стопка меньше первой

Решение:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from bisect import bisect_right
 
n, m, s = map(int, input().split())
a, b = [0], [0]
for _ in range(max(n, m)):
    x, y = input().split()
    if x != '-':
        a.append(a[-1] + int(x))
    if y != '-':
        b.append(b[-1] + int(y))
res = 0
for i in range(n + 1):
    x = s - a[i]
    if x >= 0:
        j = bisect_right(b, x) - 1
        res = max(res, i + j)
print(res)
Задача 2. Финансовая фантазия фанатичного фермера

Ограничение времени, с 1
Ограничение памяти, МБ 64

Фермер Василий выбирает землю для покупки. Предмет торгов – прямоугольное поле шириной n и высотой m, которое состоит из участков, где 1 - плодородный участок, а 0 – неплодородный. Василий может либо купить регион поля любого размера, либо отказаться от покупки, если доступных для покупки регионов нет.

Условия покупки следующие:
– Регион – это прямоугольник, ограничивающий соприкасающиеся участки плодородной почвы
– Участки "соприкасаются" если они соседние друг для друга – сверху, снизу, справа, слева и по диагонали

1 0 1
0 1 1
1 0 1

0 0 0
0 1 0
На примере выше соприкасаются все участки, кроме нижнего, то есть регионов здесь 2, один площадью 9, другой площадью 1
– Регионы могут пересекаться между собой:

1 1 1 1 1
1 0 0 0 1
1 0 1 0 1
Здесь тоже два региона, один площадью 15 (все поле), другой площадью 1
– Минимальное количество плодородных участков в регионе для покупки – 2
– Покупатель платит только за общую площадь купленного региона

Василий берет кредит на покупку, поэтому хочет потратить деньги как можно оптимальнее – купить тот регион, в котором будет максимальное соотношение плодородной земли к общей площади региона. Если есть несколько регионов с одинаковой «эффективностью», то Василий хочет купить бóльший из них по площади.

Нужно определить площадь региона, который стоит купить фермеру


Входные данные (поступают в стандартный поток ввода)
Первая строка – целые числа n, m через пробел (2≤n≤100, 2≤m≤100)

Далее m строк, в каждой из которых по n цифр 0 или 1, разделенных пробелами

Все входные данные наших тестов всегда соблюдают указанные параметры, дополнительные проверки не требуются

Выходные данные (ожидаются в стандартном потоке вывода)
Одно целое число, площадь наилучшего региона, или 0, в случае отказа от покупки

Пример 1
Ввод:
5 4
0 1 1 0 0
1 1 1 0 1
1 1 0 0 1
0 0 0 1 0

Вывод:
9

На этом поле доступны для покупки:

Первый регион для покупки
Левый верхний угол с координатами [0, 0]
Правый нижний угол с координатами [2, 2]
Его площадь 9, а плодородных участков на нем 7.
Эффективность покупки этого региона рассчитывается как 7/9

Второй регион поля для покупки
Левый верхний угол с координатами [3, 1]
Правый нижний угол с координатами [4, 3]
Его площадь 6, а плодородных участков на нем 3.
Эффективность покупки этого региона рассчитывается как 3/6

7/9 > 3/6, поэтому Василию стоит купить первый регион.


Пример 2
Ввод:
5 3
1 1 1 0 1
1 1 1 0 1
1 1 1 0 1

Вывод:
9

Здесь эффективность регионов одинакова – они оба полностью заполнены плодородной землей, но регион слева больше, поэтому ответ 9

Решение:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
from math import inf
import sys
 
sys.setrecursionlimit(15000)
 
 
def dfs(x, y):
    global coords
    if a[x][y] == 0:
        return
    a[x][y] = 0
    coords = min(coords[0], x), min(coords[1], y), max(coords[2], x), max(coords[3], y)
    for i in range(-1, 2):
        for j in range(-1, 2):
            if 0 <= x + i < m and 0 <= y + j < n:
                dfs(x + i, y + j)
 
 
n, m = map(int, input().split())
a =[list(map(int, input().split())) for _ in range(m)]
 
p = [[0] * (n + 1) for _ in range(m + 1)] # суммы в прямоугольнике
for i in range(m):
    for j in range(n):
        p[i + 1][j + 1] += p[i][j + 1] + p[i + 1][j] - p[i][j] + a[i][j]
 
regions = []
for i in range(m):
    for j in range(n):
        if a[i][j] == 1:
            coords = (inf, inf, -inf, -inf)
            dfs(i, j)
            x1, y1, x2, y2 = coords
            s = (x2 - x1 + 1) * (y2 - y1 + 1)
            count_r = p[x1][y1] + p[x2 + 1][y2 + 1] - p[x1][y2 + 1] - p[x2 + 1][y1]
            if count_r > 1:
                regions.append((s, count_r))
 
if not regions:
    print(0)
else:
    print(max(regions, key=lambda x: (x[1] / x[0], x[0]))[0])
Если будет интерес, могу разобрать с комментариями. Всем мир и добра!
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Всего комментариев 2
Комментарии
  1. Старый комментарий
    Аватар для Red white socks
    Интересно, это был очный или заочный тур? И сколько было всего заданий?
    Видимо вы выбрали разогревочные - уж больно простые: одна - упрощенная вариация суммы подмножеств, а вторая неприкрытый поиск связных компонент.
    В первой задаче у вас решение за О(N logN). Но поскольку у нас тут оба массива отсортированы, то можно сделать за один проход по каждому массиву - один указатель двигается вверх по одному шагу, другой подбирает сумму, двигаясь сверху вниз, пока кто-то не достигнет конца.
    А вторая задача сортирует людей на "широких" и "глубоких". Я почему-то всегда воюю за широких)
    Единственное, я так и не понял фишку с отказом от покупки. Артефакт от версии задачи с ограничением суммы у Фермера?
    Запись от Red white socks размещена 11.11.2022 в 13:11 Red white socks вне форума
  2. Старый комментарий
    2 задачи было. тур заочный.
    NlogN просто выбрал изза бинпоиска.
    Отказ, когда нет регионов (незнаю, такая постановка задачи).
    Запись от eaa размещена 13.11.2022 в 08:22 eaa вне форума
 
Новые блоги и статьи
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов. Логика кажется понятной: 1. Находим ключевые слова. 2. Добавляем их на. . .
Знание — сила: Доктрина интенциональности знаний, углубление в формулу
Hrethgir 01.08.2026
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11957&stc=1&d=1785567302 Знаменитый афоризм Фрэнсиса Бэкона «Знание — сила» (Scientia potentia est) в массовой культуре принято понимать. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru