Preciso de ajuda para este problema do ACM ICPC. Minha idéia atual é modelar isso como um problema de caminho mais curto, descrito na declaração do problema.
Problema
Existem N = 1000
contêineres de resíduos nucleares localizados ao longo de uma linha numérica 1-D em posições distintas-500,000 to 500,000
, exceto x=0
. Uma pessoa é encarregada de coletar todos os caixotes do lixo. Cada segundo que um recipiente de lixo não é coletado, emite 1 unidade de radiação. A pessoa começa x = 0
e pode mover a 1
unidade a cada segundo, e a coleta de resíduos leva um tempo insignificante. Queremos encontrar a quantidade mínima de radiação liberada ao coletar todos os recipientes.
Entrada de amostra:
4
Contentores localizados em [-12, -2, 3, 7]
.
A melhor ordem para coletar esses contêineres é [-2, 3, 7, -12]
, para uma emissão mínima de 50
unidades. Explicação: a pessoa entra -2
em 2 segundos e durante esse tempo a 2 units
radiação é emitida. Ele então vai para 3
(distance 5
:) para que o barril libere 2 + 5 = 7
unidades de radiação. Ele leva 4
mais alguns segundos para chegar x = 7
onde o barril emitiu 2 + 5 + 4 = 11
unidades. Ele leva 19
alguns segundos para chegar x = -12
onde o barril emitiu 2 + 5 + 4 + 19 = 30
unidades. 2 + 7 + 11 + 30 = 50
, qual é a resposta.
Notas
Existe uma O(N!)
solução óbvia . No entanto, eu explorei métodos gananciosos, como mover para o mais próximo ou para o cluster mais próximo, mas eles não funcionaram.
Pensei nesse problema por um bom tempo e o modelei como um problema de pesquisa de gráfico:
- Nós inserimos
0
como uma posição de linha de base (este será o estado inicial) - Depois, ordenamos as posições do menor para o maior.
- Em seguida, fazemos um BFS / PFS, no qual o
state
consiste- Dois números inteiros
l
er
que representam um intervalo contíguo na matriz de posição classificada que já visitamos - Um número inteiro
loc
que nos diz se estamos no ponto final esquerdo ou direito do intervalo - Um número inteiro
time
que nos diz o tempo decorrido - Um "custo" inteiro que nos informa o custo total até o momento (com base nos nós que visitamos)
- Dois números inteiros
- De cada estado, podemos mover para [l - 1, r] e [l, r + 1], ajustando os outros 3 números inteiros de acordo
- O estado final é [0, N], verificando as duas posições finais.
No entanto, parece que [L, R, loc]
não define um estado exclusivamente, e precisamos armazenar L, R, loc, and time
, minimizando cost
cada um deles. Isso leva a um algoritmo exponencial, que ainda é muito lento para o bem.
Alguém pode me ajudar a expandir minha ideia ou empurrá-la na direção certa?
Edit: Talvez isso possa ser modelado como um problema de otimização de programação dinâmica? Pensando nisso, ele tem os mesmos problemas da solução de pesquisa de gráficos - apenas porque a corrente cost
está baixa não significa que é a resposta ideal para esse subproblema, pois time
também afeta muito a resposta.
O ganancioso não funciona: eu tenho um algoritmo de seleção ganancioso que estima o custo da mudança para um determinado local (por exemplo, se movermos para a direita, dobraremos as distâncias para os barris da esquerda e assim por diante).
Você poderia fazer uma pesquisa com prioridade, com uma heurística? A heurística pode combinar o custo da viagem atual com a quantidade de tempo decorrido.