Vamos começar com a seguinte observação:
Deixe denotar o máximo da sequência e deixe denotar seu mínimo. Se , então escolher é o ideal.um 1 , . . . , a n m i n a 1 = m a x b 1 = b 2 = . . . = b n = ⌊ ( m a x + m i n ) / 2 ⌋maxa1,...,anmina1=maxb1=b2=...=bn=⌊(max+min)/2⌋
Por que esse é o caso? Bem, como a sequência começa com o máximo, escolhemos grande e sofremos um grande desvio do mínimo da sequência (já que qualquer subsequente deve ser maior ou igual a ) ou escolhemos pequeno e sofrem com o desvio para . A média minimiza o desvio máximo.b i b 1 b 1 m um xb1bib1b1max
Agora podemos tentar generalizar essa observação para usar nas seqüências gerais . Por exemplo, podemos particionar qualquer sequência em subsequências, de modo que cada uma comece com o máximo da respectiva subsequência.a1,...,an
Exemplo: é particionado em , e .( 2 ) ( 6 , 4 , 1 , 5 , 2 ) ( 8 , 7 , 5 , 1 )(2,6,4,1,5,2,8,7,5,1)(2)(6,4,1,5,2)(8,7,5,1)
Dado esse particionamento, agora podemos resolver cada uma dessas subsequências separadamente e obter uma atribuição dos 's, que, no entanto, podem violar a condição não decrescente. Isso pode ser corrigido sem perder a otimização.bi
Observe que a última subsequência sempre contém o máximo de toda a sequência (caso contrário, haveria outra subsequência depois). Seja os valores que às subseqüências. Agora, para alcançar a não diminuição em , começamos de trás em e trabalhamos o nosso caminho para a frente. Se for maior que , simplesmente configuramos . Se for menor, nós a mantemos. Depois, comparamos com e assim por diante. Observe que abaixando qualquer para o valor dew 1 , w 2 , . . . , W kmaxw1,w2,...,wkw 1 , . . . , w k w k w k - 1 w k w k - 1 : = w k w k - 2 w k - 1 w i w i + 1 w i w i + 1kw1,...,wkwkwk−1wkwk−1:=wkwk−2wk−1wiwi+1nunca aumenta o desvio, uma vez que o valor máximo na subsequência atribuída com é sempre menor que o máximo na subsequência atribuída com .wiwi+1
Esse algoritmo deve estar correto, eu acho. Em relação ao tempo de execução, a etapa principal é calcular os máximos crescentes para as subsequências, o que é possível em ? Não tenho certeza de onde contribui.lO(n)l
Eu acho que isso deve ser possível em O (n).
Tome o mesmo problema: dados , 1 ≤ i ≤ n ed ≥ 0, encontre em ordem não descendente, de modo que para todos os i ou mostre que não é possível. Isso pode ser feito em O (n) e, usando a pesquisa binária, o problema original é resolvido em O (n log l).b i | a i - b i | ≤ dai bi |ai−bi|≤d
Agora, se houver i ≤ j tal que a_i - a_j> 2d, então não haverá solução (porque ).bi≥ai−d,bj≤aj+d<ai−2d+d=ai−d≤bi
Mas se a_i - a_j ≤ 2d para todo i ≤ j, acho que sempre será encontrada uma solução. Portanto, tudo o que precisamos fazer é encontrar m = max (a_i - a_j) para todos os i ≤ j e escolher d = floor ((m + 1) / 2). Esse máximo pode ser encontrado em O (n).
fonte