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

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

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

АвторСообщение
постоянный участник




Сообщение: 430
ссылка на сообщение  Отправлено: 01.04.24 18:46. Заголовок: 7182(27-184) ошибка в решении



 цитата:
Выберите четыре элемента последовательности так, чтобы расстояние между первым и последним числами было не меньше K, а их сумма была максимально возможной. В ответе запишите найденную сумму.


при n = 8 и k = 7 на последовательности [50, 1, 1, 100, 20, 1, 40, 1] получается не верный ответ
Программа дает ответ 201 (i = 7 data = 1 maxK = 50 max1 = 100 max2 = 50 max3 = 40), т.е число 50 учитывается дважды, и как maxK, и как max2.
Правильной будет проверка: если maxK равно какому-то максимуму(1, 2 или 3), то в сумме надо учитывать два других максимума.

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







Сообщение: 306
ссылка на сообщение  Отправлено: 02.04.24 10:07. Заголовок: f=open('D:/27-1..


 
f=open('D:/27-184b.txt')
[n,k]=list(map(int,f.readline().strip().split()))
s=sorted([(int(c),i) for i,c in enumerate(f.readlines())],reverse=True)
maxi=0
for c in s:
maxi=max(maxi,max(c[0] for c in s[3:] if abs(c[1]-min(c[1] for c in s[:3]))>=k)+sum(c[0] for c in s[:3]))
ss=s[1:]
if sum(c[0] for c in s[:3])<maxi: break
print(maxi)


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Сообщение: 431
ссылка на сообщение  Отправлено: 03.04.24 13:51. Заголовок: Извините, но я вашу ..


Извините, но я вашу программу сломала
Программа с сайта:
 
with open("27-184b.txt") as F:
N, K = map(int, F.readline().split())
data = [int(x) for x in F]
sMax = float('-inf')
maxK = float('-inf')
max1 = max2 = max3 = float('-inf')
for i in range(N):
if i >= K:
maxK = max(data[i - K], maxK)
s = maxK + data[ i]
s += max1 + max2 if maxK != max1 else max2 + max3
sMax = max(s, sMax)
if data > max1:
max1, max2, max3 = data[ i], max1, max3
elif data[ i] > max2:
max2, max3 = data[ i], max2
elif data[ i] > max3:
max3 = data[ i]
print(sMax)

Моя версия:
F = open("27-184b.txt") 
N, K = map(int, F.readline().split())
sMax = -10 ** 8
maxK = -10 ** 8
max1 = max2 = max3 = -10 ** 8
queue = []
for i in range(K):
x = int(F.readline())
queue.append(x)
if x > max1:
max1, max2, max3 = x, max1, max2
elif x > max2:
max2, max3 = x, max2
elif x > max3:
max3 = x
for i in range(K, N):
x = int(F.readline())
y = queue[i % K]
queue[i % K] = x
maxK = max(y, maxK)
s = maxK + x
if maxK == max1:
s += max2 + max3
elif maxK == max2:
s += max1 + max3
else:
s += max1 + max2
sMax = max(s, sMax)
if x > max1:
max1, max2, max3 = x, max1, max2
elif x > max2:
max2, max3 = x, max2
elif x > max3:
max3 = x
print(sMax)

Все три программы и на файле А и на файле В выдают одинаковые ответы.
Если взять входные данные такие:
8 7 
50
1
1
100
20
1
40
1

моя и ваша программа дают ответ 191 (50+100+40+1), программа с сайта дает ответ 201(50+100+50+1)
Об этом и был пост выше.
А вот на файле:
11 7 
20
1
1
50
40
1
100
1
90
1
150

программа с сайта и моя выдают ответ 390(150+50+100+90), а ваша программа упала с ошибкой "max() arg is an empty sequence"
Если последнее число в файле - 150 заменить на что-то маленькое, например 13 ваша программа выдает ответ 253, видимо, 13+50+90+100.
Но есть сумма больше 90+20+100+50 = 260, этот ответ дают и моя программа и программа с сайта.
Волшебная строчка
 цитата:
maxi=max(maxi,max(c[0] for c in s[3:] if abs(c[1]-min(c[1] for c in s[:3]))>=k)+sum(c[0] for c in s[:3]))

для меня осталась почти загадкой
Компактные решения, конечно, прикольно смотрятся, но я думаю, что решение должно быть сначало понятно, а потом компактно.

Спасибо: 0 
ПрофильЦитата Ответить





Сообщение: 309
ссылка на сообщение  Отправлено: 04.04.24 12:31. Заголовок: oval пишет: Извинит..


oval пишет:

 цитата:
Извините, но я вашу программу сломала


Спасибо, что сломали!)
Насчет компактных решений согласна, но я уже так привыкла (когда пишу развернуто, внимание рассеивается на большой объем кода, а в длинном тоже не просто разбираться... Дело вкуса)
[pre2]
f = open('D:/27-184b.txt')
[n, k] = list(map(int, f.readline().strip().split()))
s = sorted([(int(c), i) for i, c in enumerate(f.readlines())], reverse=True)
maxi = 0
while s:
maxind = max(c[1] for c in s[:3])
m1 = [c[0] for c in s[3:] if abs(c[1] - maxind) >= k]
if m1: maxi = max(maxi, sum(c[0] for c in s[:3]) + max(m1))

minind = min(c[1] for c in s[:3])
m1 = [c[0] for c in s[3:] if abs(c[1] - minind) >= k]
if m1: maxi = max(maxi, sum(c[0] for c in s[:3]) + max(m1))

ss = s[1:]
if sum(c[0] for c in s[:3]) < maxi: break
print(maxi)
[pre2/]

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

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