Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 27, 2015 12:32:04

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

Ограничение времени: 1.5 секунды
Ограничение памяти: 64 МБ
Будем справедливы: сессия ставит задачи не только студентам, но и преподавателям. Любой преподаватель обучает немалое количество студентов, а ведь каждого надо еще и проверить. Поэтому один из преподавателей решил принимать экзамен по истории по такой упрощённой процедуре: студент записывает все известные ему «исторические» даты (достаточно, чтобы он написал только года, но, конечно, мог объяснить, чем замечательна та или иная дата). Преподаватель же держит перед глазами список дат, которые студент должен знать. Для оценки знаний студента преподаватель подсчитывает количество чисел в списке студента, которые также есть в списке преподавателя. В зависимости от полученного числа и выставляется итоговая оценка.
Вы должны оказать посильную помощь в автоматизации этого процесса, разработав программу для подсчёта количества совпадений в списках студента и преподавателя.
Исходные данные
В первой строке содержится число N — количество записей в списке преподавателя. 1 ≤ N ≤ 15000. Затем идет N строк, содержащих список преподавателя, по одной дате в строке. Записаны только года. Каждый год — целое число в пределах от 1 до 10^9. Даты в этом списке отсортированы по неубыванию. В следующей после списка строке содержится число M — количество записей в списке студента, 1 ≤ M ≤ 10 ^6. Затем также M строк с датами (записаны только года, каждый год — целое число в пределах от 1 до 10^9). Этот список не отсортирован. В списке как студента, так и преподавателя даты могут повторяться.
Результат
Вы должны вывести одно число — количество чисел во втором списке, которые также содержатся в первом.
Пример
исходные данные:
2
1054
1492
4
1492
65536
1492
100

результат:
2

Парюсь весь день, не могу оптимизировать

c = 0
teach_list = set(([int(input()) for _ in range(int(input()))]))
for i in range(int(input())):
    if int(input()) in teach_list:
        c += 1
print(c)

результат:
6535587	13:35:02
27 окт 2015	Vigi	1196. Экзамен по истории	Python 3.4	Time limit exceeded	8	1.528	640 КБ

подскажите идею…

Отредактировано Vigi (Окт. 28, 2015 04:18:36)

Офлайн

#2 Окт. 27, 2015 13:11:29

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

sum



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#3 Окт. 27, 2015 14:23:59

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

ZerG
sum
t = []
teach_list = set(([int(input()) for _ in range(int(input()))]))
for i in range(int(input())):
    if int(input()) in teach_list:
        t.append(1)
print(sum(t))

если так ? то снова превышение времени…

Отредактировано Vigi (Окт. 27, 2015 14:25:02)

Офлайн

#4 Окт. 27, 2015 15:45:55

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

> снова превышение времени…
Ты что хочешь сказать что эта детская задача более полутора секунд работает? Не верю!

>>> N = [1054, 1492]
>>> M = [1492, 65536, 1492, 100]
>>> len(filter(lambda x: x in N, M))
2



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Окт. 27, 2015 17:27:57

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

>>> N = [1054, 1492]
>>> M = [1492, 65536, 1492, 100]
>>> len(filter(lambda x: x in N, M))
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: object of type 'filter' has no len()
?

Офлайн

#6 Окт. 27, 2015 18:29:48

Kon52
Зарегистрирован: 2015-01-31
Сообщения: 66
Репутация: +  3  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

Vigi
У Вас 3ий?
Вам filter() возвращает итератор.
Оберните в list.
>>> N = [1, 2]
>>> M = [2, 3, 2, 4]
>>> len(list(filter(lambda x: x in N, M)))
2
>>>

Отредактировано Kon52 (Окт. 27, 2015 18:30:19)

Офлайн

#7 Окт. 27, 2015 20:54:38

Kon52
Зарегистрирован: 2015-01-31
Сообщения: 66
Репутация: +  3  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

len([i for i in M if N.count(i)])

Офлайн

#8 Окт. 28, 2015 01:04:23

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

Rodegast
Ты что хочешь сказать что эта детская задача более полутора секунд работает? Не верю!
Он её ещё и скопировал неправильно. Степени превратились в обычные цифры.

Vigi
Каждый год — целое число в пределах от 1 до 109.

Скорее всего, надо применять бинарный поиск, так как преподские даты отсортированы.



Офлайн

#9 Окт. 28, 2015 04:29:21

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

Kon52

ch = [int(input()) for _ in range(int(input()))]
sd = [int(input()) for _ in range(int(input()))]
print(len(list(filter(lambda x: x in ch, sd))))

out:
6537990	07:20:59
28 окт 2015	Vigi	1196. Экзамен по истории	Python 3.4	Time limit exceeded	8	1.544	16 268 КБ

Он её ещё и скопировал неправильно. Степени превратились в обычные цифры.
да ссори не заметил

Скорее всего, надо применять бинарный поиск, так как преподские даты отсортированы.
а можно по подробней как реализовать ?

Офлайн

#10 Окт. 28, 2015 07:52:34

Vigi
От: Курья, Алтай
Зарегистрирован: 2015-02-07
Сообщения: 144
Репутация: +  8  -
Профиль   Отправить e-mail  

Задача: 1196. Экзамен по истории

def binary_search(li, x):
    i = 0
    j = len(li) - 1
    while i < j:
        m = int((i + j) / 2)
        if x > li[m]:
            i = m + 1
        else:
            j = m
    if li[j] ==x:
        return j
    else:
        return None
ch = [int(input()) for _ in range(int(input()))]
st = [int(input()) for e in range(int(input()))]
c = []
for i in st:
    if binary_search(ch, i) != None:
        c.append(1)
print(sum(c))

6538262	10:48:39
28 окт 2015	Vigi	1196. Экзамен по истории	Python 3.4	Time limit exceeded	8	1.513	16 248 КБ

то же не то….

я бы давно уже все бросил но тут сказали, что на питоне это слишком трудно сделать почти не возможно
За державу обидно как-то стало…

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version