код выдает неверный ответ

Рейтинг: -3Ответов: 2Опубликовано: 14.05.2023

решала задачу:

Подсчитайте количество способов представить натуральное число n в виде суммы двух различных натуральных чисел, каждое из которых не превышает k и первое число меньше второго.

примеры
Ввод
3 5
Вывод
1

Ввод
2 4
Вывод
0

5 6
Вывод
2

Написала по ней код, но тестирующая система пишет, что он выдает неверный ответ на четвертом тесте. Мой код:

n, k=map(int, input().split()) 
ans=0
for i in range(1, n//2+1):
    if i<n-i and n-i<=k:
        ans+=1 
print(ans)

Конечно, на приведенных выше тестах все работает хорошо, но я не знаю, что еще исправить.

Ответы

▲ 2

Число 2 не логично составлять из чисел меньших 4-х (хотя и возможно)

Ваш вариант можно было бы записать короче с использованием дополнительно переменной:

def test(n, k):
    counter=0
    delta = 1 if n%2 == 0 else 0
    for i in range(n//2-delta):
        if i<n-i and n-i<=k:
            counter+=1
    print(counter)

Теперь с условием сказанного в начале перепишем Ваш вариант так, он дает те же ответы:

def test2(k, n):
    counter = 0  
    for i in range(n//2+1):
        a = i
        b = n - i
        if (a < b  and b <= k):            
            counter +=1
    print(counter)
test(3, 5) # 2,3  = 1 
test(2, 4) # 2,2  = 0 (числа не могут быть равными)
test(5, 6) # 1,5;2,5 = 2
▲ 1

Простая функция, дающая верные результаты:

def tst(n, k):
    counter = 0
    for lo in range(1, (n+1)//2):
        hi = n - lo
        if hi <= k:
            counter += 1
    return counter

Оптимизированная:

def sum_distinct(n, k):
    return max(0, min(n - 1, k) - (n-(n-1)//2) + 1)

Откуда что взялось:
меньшее слагаемое находится в диапазоне 1..lo=(n-1)//2
большее - в диапазоне n-lo..n-1
применив к верхней границе ограничение k, получаем количество вариантов сумм