На этом форуме отвечают на конкретные вопросы. Фраза «я не понимаю, как решать» — это не вопрос. На вопрос «как решить задачу №X» вас отошлют к материалам сайта kpolyakov.spb.ru. За бессвязный поток слов и неспособность формулировать свои мысли — бан.

Если у вас не сходится ответ на какую-то задачу, пожалуйста сразу представляйте свое «правильное» решение.
Программы "заворачивайте" в тэг [pre2]...[/pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Для регистрации на форуме щелкните по ссылке «Вход-регистрация» вверху страницы. В открывшееся окошко «ник» введите свою фамилию на русском языке (например, Иванов). В окошко «пароль» введите придуманный вами пароль, состоящий из латинских букв и цифр. Поставьте галочку в окошке «зарегистрироваться, я новый участник» и нажмите кнопку «ОК».

АвторСообщение



Сообщение: 84
ссылка на сообщение  Отправлено: 12.07.22 11:32. Заголовок: №4507 (27.78) ошибки в алгоритме


Здравствуйте! В алгоритме "27-78.py" есть ошибки:

1) Если самая длинная цепочка будет начинаться с первого члена последовательности и этот член будет кратен 73, то длина цепочки определится неверно. Связано это с тем, что в tailSum хранится i отсчитывающееся с единицы, а не нуля, а в начальных значениях занесен 0.

Данные:

 
3
73
2
73


Алгоритм выдаст ответ 4, хотя у нас всего 3 члена последовательности.

2) maxSum определяется неверно, потому что x слишком рано прибавляется к totalSum и в tailSum получается, что хранится сумма хвоста, которую нужно вычесть + первый член цепочки, для которой вычисляется сумма.

Данные:

 
8
145
2
1
2
6
28
10
67


Правильный ответ 3 (145 + 2 + 1 = 148, 148 / 37 = 4 и (145 + 1) / 73 = 2), алгоритм же выдаст 4 с максимальной суммой 105, что неправильно. Во-первых, максимальная сумма будет 111 (6 + 28 + 10 + 67), но алгоритм вычитает первый член цепочки и получается 105. Во-вторых, 148 больше 111, но поскольку алгоритм каждый раз вместе с tailSum вычитает первый член цепочки, получается что он сравнивает две суммы (148 - 145) и (111 - 6).

На всякий случай сам алгоритм:

 
K, M = 37, 73

F = open("27.txt")
N = int( F.readline() )

tailSum = [ [0] + [None]*(K-1) ]
for i in range(M-1):
tailSum.append( [None]*K )

tailLen = [[0]*K for i in range(M)]

maxSum, minLen = 0, 0
totalSum = 0
r = 0

for i in range(1,N+1):
x = int( F.readline() )
totalSum += x
ri = x % M

if tailSum[ri][r] == None:
tailSum[ri][r] = totalSum
tailLen[ri][r] = i

r0 = (M - ri) % M
r = totalSum % K
if tailSum[r0][r] != None:
curSum = totalSum - tailSum[r0][r]
curLen = i - tailLen[r0][r] + 1
if curSum > maxSum or \
(curSum == maxSum and curLen < minLen):
maxSum = curSum
minLen = curLen

F.close()
print( minLen )


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]


Администратор




Сообщение: 3651
ссылка на сообщение  Отправлено: 09.08.22 14:26. Заголовок: Спасибо за тщательны..


Спасибо за тщательный анализ и примеры. Решение исправлено.

___________________________________________________
Имей мужество пользоваться собственным умом. (И. Кант)
Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 2020
Права: смайлы да, картинки да, шрифты нет, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет