Created
March 1, 2016 11:42
-
-
Save pochemuto/59b50330ba707c27a922 to your computer and use it in GitHub Desktop.
Yandex Test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#coding=utf | |
# На зачёт к преподавателю английского языка пришли 30 студентов: | |
# 13 с факультета экономики, 9 с факультета математики и | |
# 8 с факультета компьютерных наук. | |
# Их одинаковые внешне и на ощупь зачётные книжки лежат на столе. | |
# Какое наибольшее количество зачётных книжек должен взять преподаватель, | |
# чтобы быть уверенным, что среди оставшихся на столе присутствуют | |
# зачётки хотя бы 7 студентов одного факультета и 4 студентов другого? | |
# https://yandex.ru/math/test/ | |
from math import ceil | |
from itertools import permutations | |
def terms(value, size): | |
if size < 1: | |
raise "Size must be greater than zero" | |
if size > value: | |
raise "Size greater than value" | |
if size == 1: | |
yield (value,) | |
return | |
first_most = value - size + 1 # из расчета, чтобы хватило в каждую оставшуюся ячейку по единичку | |
first_least = int(ceil((value - size + 2) / 2.0)) | |
for i in range(first_most, first_least - 1, -1): | |
for sub in terms(value - i, size - 1): | |
yield (i,) + sub | |
def termsWithZeros(value, size): | |
for s in range(1, min(value, size) + 1): | |
for t in terms(value, s): | |
yield t + (0,) * (size - s) | |
students = (13, 9, 8) | |
groups = len(students) | |
def find(students, test): | |
for removed_count in range(1, sum(students) + 1): | |
for remove_combination in termsWithZeros(removed_count, groups): | |
for removed in permutations(remove_combination, groups): | |
left = [s - r for s, r in zip(students, removed)] | |
if not all(i >= 0 for i in left): | |
continue | |
if not test(left): | |
return removed_count - 1, left | |
def test(left): | |
left = sorted(left, reverse=True) | |
return left[0] >= 7 and left[1] >= 4 | |
print find(students, test) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment