Форум » Массивы, сортировка, работа с файлами » прошу, помогите найти ошибку в решении задания 26-68 » Ответить

прошу, помогите найти ошибку в решении задания 26-68

gardemarina: здравствуйте! никак не могу понять, где ошибка. Количество удаленных вирусов сходится, а время нет. 68) (Л. Шастин) Компьютер был заражён вирусами. Супервирусами называются самые опасные вирусы, уровень опасности которых превышает средний уровень опасности всех имеющихся. Нужно определить, какое максимальное количество вирусов можно удалить за заданное время по следующим правилам: - необходимо удалить как можно больше супервирусов; - нельзя удалять два и более супервируса подряд; - нельзя удалять супервирус последним. Входные данные представлены в файле 26-68.txt следующим образом. Первая строка входного файла содержит количество записей N и общее время T, отведённое на удаление этих вирусов. Каждая из следующих N строк содержит два целых числа: уровень опасности вируса и время, которое требуется для его удаления. Запишите в ответе два числа: сначала общее количество вирусов, которое удалось удалить, затем суммарное время, которое было затрачено на удаление супервирусов. Пример входного файла: 5 50 7 13 9 20 4 3 8 9 5 5 Средний уровень опасности равен 6.6, значит, суперопасными считаются вирусы с уровнем опасности >= 7. Удаляем сначала супервирус 8-9, далее обычный вирус 4-3, потом снова суперопасный 7-13, затем обычный 5-5. Обычных вирусов не осталось, значит, суперопасные тоже удалять нельзя. Итого удалено 4 вируса. На удаление супервирусов затрачено времени 9 + 13 = 22. Ответ: 4 22. [pre2]from math import floor with open(r'C:\Users\Редакция\Desktop\26-68.txt') as file: n, time = list(map(int, file.readline().split())) data = [[int(i.split()[0]), int(i.split()[1])] for i in file.readlines()] sr_list = [i[0] for i in data] sr = sum(sr_list) / len(data) supervirus = sorted([i for i in data if i[0] > sr], key=lambda x: x[1]) other = sorted([i for i in data if i not in supervirus], key=lambda x: x[1]) t = 0 co = 0 s = 0 for i in range(len(other) * 2 - 1): if i % 2 == 0: i = int(i / 2) if s + supervirus[ i][1] <= time: t += supervirus[ i][1] co += 1 s += supervirus[ i][1] else: i = floor(i / 2) if s + other[ i][1] <= time: co += 1 s += other[ i][1] print(co, t)[/pre2] P.S. везде в теле цикла двойная индексация с первым индексом i, однако она почему-то не отображается :)

Ответов - 3

LeoShastin2601: Здравствуйте! В первом ветвлении нужно поменять условие добавления супервирусов. Будет верно так -> if s + supervirus[1] + other[1] <= time: {действие} Из условия имеем, что супервирус не может быть удален последним. В вашем случае это условие нарушается - удаляете последним ещё один (уже лишний) супервирус. Добавляем дополнительную проверку, которая выясняет, сможем ли мы после удаления этого супервируса удалить обычный (чтобы не нарушить порядок). Если да - удаляем. Иначе уже переходим в блок else.

gardemarina: LeoShastin2601 пишет: Из условия имеем, что супервирус не может быть удален последним. В вашем случае это условие нарушается - удаляете последним ещё один (уже лишний) супервирус. спасибо большое! мне тогда почему-то показалось, что нечётность последнего i в цикле будет достаточным условием, но это, конечно, не так)

elpov06: я не понимаю , почему не считают 9 20, подскажите пожалуйста




полная версия страницы