Решение задач Yandex Cup 2023 на Java

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Компания Yandex организовала интересное соревнование с хорошим призовым фондом. Из 6 направлений я выбрал бэкенд, в котором по языку Java было 5 задач. Их нужно было решить за 5 часов. Я выбрал удобное время и сразу столкнулся с такой проблемой - мне было сложно понять условия задачи. Наверное стиль изложения обусловлен защитой от использования ChatGPT или это какой егэшый диалект, но после того, как задача была решена, условия сразу становятся логичными и понятными. Сразу оговорюсь, что за 5 часов я не решил ни одной (shame on you) задачи, но сейчас попытаюсь исправиться, что бы поделится опытом и возможно получить обратную связь от более опытных программистов. Для удобства каждое решение выложу в отдельной статье.


Первая задача - Арт-критика (описание под катом). 

Hidden text

Аркадий — главный редактор журнала по арт-критике. По долгу службы Аркадий постоянно сталкивается с фундаментальными вопросами "Что есть красота?”, “Как понять что красиво, а что нет?”.

Главред понимает, что искусство можно оценивать по-разному и к разным арт-объектам можно применять разные метрики. За годы работы в арт-индустрии Аркадий выработал собственный принцип оценки красоты любого произведения искусства. Он может сказать, красив арт-объект или нет, вне зависимости от количества критериев оценки "красивости".

Принцип Аркадия состоит в следующем. Для произвольного объекта искусства определяется некоторое количество критериев в определенном порядке для оценки “красивости”. По каждому критерию можно набрать максимум n первичных баллов. Вторичные баллы за условный критерий i определяются следующим образом:

  • Если при оценке критерия набирается ai первичных баллов, то Аркадий начисляет критерию a2i вторичных баллов.

  • Кроме того, Аркадий прибавляет бонусные баллы за ai следующих ненулевых оценок по другим критериям (прибавляются первичные баллы).

  • Для последнего критерия дополнительные баллы не начисляются.

Например, если n = 10, Аркадий оценивал картину по пяти критериям, и арт-объект набрал [10, 0, 1, 0, 3] первичных баллов, соответственно, то его итоговый результат будет равен 117 вторичных баллов, так как за первый критерий он получил 102 + 1 + 3 балла, за второе и четвертое — по 0, за третье — 12 + 3, за пятое — 32.

Аркадий дал последовательность результатов m оценок критериев произведения искусства. Определите общую сумму вторичных баллов.

Формат ввода: 

В первой строке даны два целых числа n и m (1 ≤ n, m ≤ 200 000). 

Во второй строке заданы m целых чисел ai (0 ≤ ai ≤ n).

Формат вывода:

Выведите сумму набранных баллов.

Пример 1:

Ввод:

10 5

10 0 1 0 3

Вывод:

117

Пример 2:

Ввод:

5 5

0 0 0 0 0

Вывод:

0

Пример 3:

Ввод:

1 3

1 1 1

Вывод:

5

Первым делом получаем на вход два числа - максимальная оценка и количество параметров. Получим их с помощью класса Scanner:

Scanner scanner = new Scanner(System.in);

int maxScore = scanner.nextInt();

int parameterQuantity = scanner.nextInt();

Второй строкой получаем оценки. Их будем добавлять в ArrayList, потому что их количество будет меняться.

List<Integer> scoreList = new ArrayList<>();

for (int i = 0; i < parameterQuantity; i++) {

    int nextScore = scanner.nextInt();

    scoreList.add(nextScore);

}

scanner.close();

Теперь высчитываем “вторичные баллы”. Берем первое число из scoreList, возводим в квадрат, добавляем к нему остальные числа из хвоста scoreList и суммируем в какой-нибудь агрегатор. Затем выводим результат.

int acc = 0;
int tempScore;
for (int i = 0; i < parameterQuantity; i++) {
    tempScore = scoreList.get(i);
    if (tempScore == 0) continue;
    tempScore = tempScore * tempScore;
    for (int j = i + 1; j < parameterQuantity; j++) {
        if (scoreList.get(j) == 0) continue;
        tempScore += scoreList.get(j);
    }
    acc += tempScore;
}
System.out.println(acc);

Скорее всего, это неправильное решение, т.к. в третьем примере этот код выводит 6 вместо 5.

Давайте разберем этот пример, может кто-то сможет найти ошибку в решении. Итак, на вход поступают числа: 1 (максимальная оценка за один параметр), 3 (количество параметров оценивания) и три единицы (оценки по трем параметрам, которые получил арт-объект).

Берем первую оценку 1, возводим в квадрат и добавляем две единицы, получаем 3. Далее берем вторую единицу, возводим в квадрат и добавляем последнюю единицу, получаем 2. Последняя единица просто возводится в квадрат без добавлений. Итог, 3 + 2 + 1 = 6. А должно быть 5.

Следующая задача будет посложнее.

Источник: https://habr.com/ru/articles/772748/


Интересные статьи

Интересные статьи

Собственные исключения в Java позволяют разработчикам создавать исключительные ситуации, специфичные для их приложений или библиотек. Они позволяют более гибко управлять ошибками и обрабатывать их в с...
В ноябре прошлого года, после десяти лет неудачных попыток, Дэвид Смит, самопровозглашенный «любитель фигур» из Бридлингтона в Восточном Йоркшире, Англия, заподозрил, что, возможно, он наконец-то ...
Какие задачи пользователю нужно выполнять в рамках CI-пайплайна или при локальной разработке? Среди них может быть что угодно, но самое очевидное — это, наверное, запуск линтеров, всевозможных unit-те...
В предыдущей подробной статье про Полный геном мы обещали опубликовать три задачи и подарить тест тому, кто первым решит все три правильно. Заодно в этих задачах мы даем примеры, как можно работа...
Перфекционизм — ласковый убийца. Он убил больше нервов, отношений и проектов, чем кухонный нож, автомат Калашникова и твой заказчик вместе взятые. В этой статье я объясню, почему тебе не нужно...