@Iqv

Что не так в коде (Python3)?

Некоторый завод умеет производить N=100000 различных видов деталей. В каталоге деталей, которые могут быть произведены на этом заводе, все они пронумерованы числами от 1 до N

. При этом для производства некоторых деталей сначала нужно произвести какие-то другие детали. При этом детали «не расходуются», например, если для производства детали номер 6 нужны детали номер 7 и 8, а для производства детали номер 7 также нужна деталь номер 8, то для производства детали номер 6 нужно произвести детали номер 8, 7, 6 (деталь номер 8 будет использована и для производства детали номер 7, и для производства детали номер 6) по одному разу. То есть каждую деталь из каталога нужно произвести не более одного раза, или вообще можно не производить, если она не требуется.

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

Входные данные
Первая строка входных данных содержит число n
, (1≤n≤100000). Каждая из последующих n строк входного файла описывает характеристики производства деталей. Здесь i-я строка содержит список деталей, которые требуются для производства детали с номером i

. В списке нет повторяющихся номеров деталей. Список может быть пустым: тогда ему будет соответствовать пустая строка!

Суммарно во всех списках содержится не более 200000 элементов. Гарантируется, что не существует циклических зависимостей в производстве деталей.

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

ПРИМЕР
ввод
6
3 6

4

2 6
4

вывод
4

Для производства детали 1 нужны детали 3 и 6, каждая из них требует для производства деталь 4. Итого нужно произвести 4 детали (1, 3, 6, 4), детали 2 и 5 производить не нужно.
def do(n):
    global k, tot
    tot.append(n)
    k += 1
    for i in range(len(arr[n-1])):
        if arr[n-1][i] in tot:
            pass
        else:
            do(arr[n-1][i])

tot = []
k = 0
n = int(input())
arr = [0]*n
for i in range(n):
    arr[i] = list(map(int,input().split()))
do(1) 
print(k)


Partial Solution. Your score is = 24, 24/29 tests passed
Какие тесты не подходят?
  • Вопрос задан
  • 482 просмотра
Решения вопроса 2
Sly_tom_cat
@Sly_tom_cat
.
Без набора тестов - не понять какие не проходят.

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

Да и в цикле - если вы идете по элементам списка то вам незачем идти по индексам, а потом получать элемент по индексу. Проще организовать цикл по самому списку тогда в переменной цикла у вас сразу будут элементы.

Вот мой вариант вашего алгоритма (с озвученными выше изменениями):

#!/usr/bin/env python3

def do(n):
    tot.add(n)
    for i in arr[n-1]:
        if i not in tot:
            do(i)


tot = set()
arr = []
for i in range(int(input())):
    arr.append(list(map(int,input().split())))
do(1)
print(len(tot))
Ответ написан
Комментировать
longclaps
@longclaps
Трэшачок.
def do(a):
    a -= 1
    if kkk[a]:
        return
    kkk[a] = 1
    for b in arr[a]:
        do(b)

n = int(input())
arr = []
kkk = [0] * n
for i in range(n):
    arr.append(list(map(int, input().split())))
do(1)
print(sum(kkk))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы