1

Тема: задача 4746 з e-olymp

Ось сама задача - https://www.e-olymp.com/uk/problems/4746
Мій розв'язок

x = 0
n = int(input())
arr = sorted(list(map(int, input().split())), key=int, reverse=True)
for i in range(n):
    if arr[i] - i > 0:
        x += arr[i] - i
print(x)

Проблема в тому, що код проходить тільки 96% тестів. Решта 4% - помилка виконання.
Підкажіть, будь ласка, у чому може бути проблема.
Я щось підозрюю, що задачу просто неможливо розв'язати на python. У статистиці цієї задачі усі розв'язки на c++, але там тільки найкращі розв'язки, тому не впевнений.

2 Востаннє редагувалося koala (05.04.2019 10:31:21)

Re: задача 4746 з e-olymp

Там проблема при n=0. Причому, схоже, з помилкою в умові: мало бути "якщо n>0, то наступний рядок містить", а то в них узагалі наступного рядка немає.

print(sum(x-i for i,x in enumerate(sorted([int(x) for x in input().split()])[::-1]) if x>i) if int(input())>0 else 0)
Подякували: Eff1c1

3

Re: задача 4746 з e-olymp

А нащо ви  key=int додали?

Подякували: Eff1c1

4

Re: задача 4746 з e-olymp

Eff1c там колись була розмова про стиль коду - так він дійсно кращий ніж в koala. Там не те що не по PEP8, там рядок навіть в 100 символів не влазиться. :) Можна би ще змінні краще називати, але то для олімпіад неактуально.

Вирішив по своєму зробити, 75% завалилось бо не в тому порядку посортував, виправив, пройшов 100:

n = int(input())
if n:
    arr = sorted([int(x) for x in input().split()], reverse=True)
    print(sum(max(x-i, 0) for i, x in enumerate(arr)))
else:
    print(0)

Може варто підкачатись на таких всяких алгоритмах і пробувати валити звідси кудись в Google.

Подякували: Eff1c, koala2

5 Востаннє редагувалося koala (05.04.2019 23:50:05)

Re: задача 4746 з e-olymp

Ні, ну серйозно я б писав якось так

def hobotania(tips):
    tips = sorted(tips, reverse = True)
    result = sum(tip-i for i, tip in enumerate(tips) if tip>i)
    return result

if __name__ == "__main__":
    client_count = int(input())
    if client_count == 0:
        print(0)
    elif 0 < client_count <=100:
        tips = [int(x) for x in input().split()]
        if len(tips)!=client_count:
            raise ValueError('Second line should consist of N numbers')
        print(hobotania(tips))
    else:
        raise ValueError('Hobotania: N must be in 0..100')