Участники викторины письменно отвечают на 10 вопросов различной сложности. За правильный ответ начисляется от 1 до 5 баллов в зависимости от сложности вопроса. За неверный ответ вычитается от 1 до 5 баллов.
Участник может не отвечать на какой-то вопрос, в таком случае баллы за этот вопрос не начисляются.
По результатам викторины для каждого участника вычисляются три показателя:
1) сумма — общее количество набранных баллов;
2) плюсы — сумма баллов без учёта неверных ответов;
3) ответы — общее количество сданных ответов (верных и неверных).
В таблице результатов участники располагаются по убыванию первого показателя — суммы, при равенстве сумм – по убыванию второго показателя (плюсов), при равенстве сумм и плюсов – по убыванию третьего показателя (ответов). При равенстве всех трёх показателей участники располагаются в итоговой таблице в порядке возрастания их личных номеров.
Дальнейший отбор проводится среди тех, кто набрал положительную сумму баллов, участники с нулевой и отрицательной суммой исключаются.
В следующий тур проходят участники, занявшие места в первой четверти полученной таблицы (учитываются только положительные результаты), а также те, у которых все три показателя такие же, как у занявшего последнее место в первой четверти таблицы.
Право участия в дополнительном отборочном туре получают 10% из тех, кто набрал положительную сумму, но не попал сразу в следующий тур, а также те, у которых все три показателя такие же, как у занявшего последнее место среди этих 10 %.
Примечание. Во всех случаях, когда вычисленное количество участников оказывается не целым, учитывается целая часть полученного числа.
Определите ID участника, занимающего в таблице первое место среди тех, кто прошёл в дополнительный отборочный тур, а также общее количество участников дополнительного отборочного тура.
Входные данные.
Первая строка входного файла содержит целое число N (N ≤ 10 000) — общее количество участников. Каждая из следующих N строк соответствует одному участнику и содержит 11 целых чисел, разделённых пробелами: сначала ID участника, затем — баллы, полученные им за каждый из 10 вопросов.
Гарантируется, что ID участников не повторяются.
В ответе запишите два целых числа: сначала требуемый ID, затем требуемое количество.
Ответ:
Приведём решение на языке Python.
f = open("downloads26.txt").readlines()
f = [x.replace("\n", "").split() for x in f]
f = [list(map(int, x)) for x in f]
round_1 = []
for i in f:
summ = sum(i[1:])
id_ = i[0]
x = 0 #сумма +
c = 0 #кол-во ответов
for elem in i[1:]:
if elem > 0:
x += elem
if elem != 0:
c +=1
if summ > 0:
round_1.append((summ,x,c,id_))
round_1 = sorted(round_1, key=lambda x: [x[3]])
round_1 = sorted(round_1, key=lambda x: [x[0], x[1], x[2]],reverse = True)
round_2 = round_1[:len(round_1)//4]
a = round_1[len(round_1)//4]
for elem in round_1[len(round_1)//4:]:
if elem[0] == a[0] and elem[1] == a[1] and elem[2] == a[2]:
round_2.append(elem)
b = round_1[1808:((len(round_1)-len(round_2))//10)+1808]
final_round = b
for elem in round_1[((len(round_1)-len(round_2))//10)+1808:]:
if elem[0] == 12 and elem[1] == 16 and elem[2] == 8:
final_round.append(elem)
print(final_round[0][3],len(final_round))
Ответ: 3348 и 535.
Приведём решение Юрия Красильникова на языке Python.
def дополнение(список,позиция):
значения = список[позиция][1:]
while список[позиция][1:] == значения: позиция += 1
return позиция
баллы = [list(map(int,s.split())) for s in open('26.txt')][1:]
показатели = [[x[0],sum(x[1:]),sum(t for t in x[1:] if t > 0),len([t for t in x[1:] if t != 0])] for x in баллы if sum(x[1:])>0]
показатели.sort(key = lambda x: x[0])
показатели.sort(key = lambda x: x[1:],reverse = True)
первый_тур = дополнение(показатели,len(показатели)//4-1)
не_прошедшие = показатели[первый_тур:]
дополнительный_тур = дополнение(не_прошедшие,len(не_прошедшие)//10-1)
print(не_прошедшие[0][0],дополнительный_тур)

