Как улучшить код на Python(олимпиадная задачка)?
Есть код к олимпиадной задаче, который подходит под 5 из 9 условий. Код и условия ниже.
n = int(input())
a = [int(i) for i in input().split()]
k = 0
x = []
for i in range(1, n+1):
if i!=n:
if sum(a[:i])%i==0 and sum(a[i:])%(n-i)==0:
l = [str(sum(a[:i])/i)]*i + [str(sum(a[i:])/(n-i))]*(n-i)
if l not in x:
k+=1
x.append(l)
if sum(a)%n==0:
if [str(sum(a)/n)]*n not in x:
k+=1
print(k)
Ответы (1 шт):
Автор решения: vp_arth
→ Ссылка
Основные моменты:
- set для хранения найденных решений
даёт уникальность из коробки, теперь не нужно проверять
not in x divmodвместо двух делений, суммы теперь тоже считаются однажды- крайний случай(всего один участок) объединил с остальным решением
if i else (0, 0)
def solve(a, n):
variants = set();
for i in range(n):
left, right = a[:i], a[i:]
l_avg, l_rem = divmod(sum(left), i) if i else (0, 0)
r_avg, r_rem = divmod(sum(right), n - i)
if l_rem == r_rem == 0:
variants.add(','.join([str(l_avg)] * i + [str(r_avg)] * (n-i)))
return len(variants)
Можно добавить микрооптимизаций, вроде бегущих сумм, но непонятно по каким критериям нужно «улучшать» этот код:
def solve(a, n):
variants = set();
l_sum, r_sum = 0, sum(a)
for i in range(n):
l_avg, l_rem = divmod(l_sum, i) if i else (0, 0)
r_avg, r_rem = divmod(r_sum, n - i)
if l_rem == r_rem == 0:
# variants.add(','.join([str(l_avg)] * i + [str(r_avg)] * (n-i)))
variants.add(f'{i}, {l_avg}, {r_avg}' if i and l_avg != r_avg else r_avg)
l_sum += a[i]
r_sum -= a[i]
return len(variants)
a = [10, 4, 2, 7, 5, 8, 6, 6, 15] assert solve(a, len(a)) == 3 a = [3, 5, 2, 7, 6, 4, 5, 8, 1, 7] assert solve(a, len(a)) == 3