Я застрял с проблемой, которая говорит о том, что вы можете разбудить спящего человека, и состояние этого человека меняется с S
, что означает сон, до .
, что означает бодрствование.
Когда вы будите человека, люди рядом с ним также просыпаются от сна, потому что расстояние близко.Например, в комнате спят три человека.Если вы разбудите человека посередине, то все три человека проснутся, то есть SSS
станет ...
.
Однако, если вы разбудите человека, который уже проснулся, его статус не будетменять.Но люди рядом с ним будут бодрствовать, то есть S.S
становится ...
,
Проблема в том, что, учитывая комнату s
, заполненную спящими людьми S
и бодрствующими людьми .
.После пробуждения k
человек, какое максимальное количество бодрствующих людей в этой комнате.
Хитрый пример: s
= S.SSSS
и k
= 2
.
- бодрствующий человек
s[4]
, тогда комната будет S.S...
- бодрствующий человек
s[1]
, тогда комната будет ......
То есть, вы можете разбудить всех в этой комнате после пробуждения человека s[4]
и человека s[1]
.Таким образом, ответом этого примера будет 6
человек вместо 5
.
Я написал свое решение на python, перечислив все комбинации индекса людей, которых я мог разбудить.Разбудить их и подсчитать количество бодрствующих людей.
Работает только с короткими строками и небольшим количеством людей.
Думаю, мне нужны некоторые улучшения на алгоритмическом уровне.Любое предложение или подсказка будет принята с благодарностью.Заранее спасибо.
import sys
import itertools
memo = {}
def wake(s, i):
if i in memo:
return memo[i]
s = list(s)
for n in i:
if n == 0:
s[n], s[n+1] = '.', '.'
elif n == len(s)-1:
s[n-1], s[n] = '.', '.'
else:
s[n-1], s[n], s[n+1] = '.', '.', '.'
memo[i] = s.count('.')
return memo[i]
if __name__ == '__main__':
with open(sys.argv[1]) as f:
line = f.readline()
n, k = map(int, list(line.rstrip().split(' ')))
line = f.readline()
s = line.rstrip()
ans = 0
for i in itertools.combinations(range(n), k):
temp = wake(s, i)
if temp > ans:
ans = temp
print(ans)
Для целей тестирования я поставлю несколько тестовых случаев и правильные ответы ниже.
Format:
n k
s
ans
5 3
.....
5
12 2
.SSSS.SS.SSS
9
7 1
..S.SS.
6
67 4
SS.S...S....SS..S..S.S.S...SS...SSS..SS.SS.SSSSS...S.S.S...S......S
48
29 2
.S.....SSSSS.SSSS...SS.SSS.SS
18
79 6
.S...SSS.SSS..SSSS.SSSSS.SS.S.SS.SS.SSSSSSS.SS...SS.S.SSS.SS.S.SS..S..S.SSS.SS.
47
41 9
.S.S...S.S.....S.SS.SS.SS.SS.S.SS.SS.....
41
91 67
...SS.SS....S...S.S.SS...SSS.SSSSSSS.....SS..S.S.SS...S..S..S.SS.......SSSSS.S.S...S.SS.S.S
91
7 97
SSSS.SS
7
276 23
SSSSSS.SSS..SSS.SS.S.SSSSSSSSSSSSSSSSSSSSSSSSSSSSSS.SS.SSSSSSSSSSSSSSSSSSS.SSSSSS.SSSSSSSSSSSSSSSSSS.SSSSSSSSSSSSSSSSSSSSSSSSS.SSSSSSSSSSSSSSSSS.SSSSSSSSSSSSSS.S.SSS.SSSSSS.SSSSSSSSSSS.SSSSSSSSSSSSS.SSSSSSS.S.SSSS.SSSSSSSSSSSS.SSSSSSSSSSSSSSSS.SSS.S.SS.SSSSSSS.SSSSSSSS.SSS.S.
100