Avez-vous joué à ce jeu sur Skating Link?
Regardez de l'arrière dans l'ordre et mettez à jour haut et bas La correspondance est différente selon que le nombre dans l'ordre actuel est plus grand que haut, plus petit que bas ou entre les deux à ce moment. Low est mis à jour à chaque fois, mais high n'est pas toujours le point qui m'a attiré
math.py
K=int(input())
A=list(map(int,input().split()))
if A[-1]!=2:
print(-1)
exit()
low=2
high=3
for item in A[::-1]:
#print(low,high)
if high<item:
print(-1)
exit()
elif item<low:
low=(-((-low)//item))*item
if low>high:
print(-1)
exit()
high=max(low+item-1,high+item-1-high%item)
else:
low=item
if low>high:
print(-1)
exit()
high=low+item-1
print(low,high)
Étant donné que le tour est d'environ 10 ** 5 au mieux, ce n'est pas grave s'il s'agit de logN même si vous décidez du nombre de personnes et simulez Ainsi, vous pouvez trouver le nombre de personnes avant le début du jeu par recherche de deux minutes Si le réglage rond n'est pas faisable, il sera bogué, alors simulons enfin haut et bas pour voir si la réponse est correcte.
Au début, je me demandais s'il fallait tronquer la condition de fin ou la valeur médiane de 2. J'ai fait beaucoup d'essais et d'erreurs, mais j'aime la façon dont je l'écris maintenant Nibutan était fou quand j'ai rendu la plage de réglage initiale ridicule et juste avant TLE.
bisect.py
K=int(input())
A=list(map(int,input().split()))
def func(num):
for item in A:
num=num//item*item
return num
ok=10**20
ng=0
while ok-ng>1:
mid=(ok+ng)//2
if func(mid)>=2:
ok=mid
else:
ng=mid
low=ok
ok=10**20
ng=0
while ok-ng>1:
mid=(ok+ng)//2
if func(mid)>=4:
ok=mid
else:
ng=mid
high=ng
if func(low)==2 and func(high)==2:
print(low,high)
else:
print(-1)