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 = 1000contê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 = 0e pode mover a 1unidade 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:
4Contentores 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 50unidades. Explicação: a pessoa entra -2em 2 segundos e durante esse tempo a 2 unitsradiação é emitida. Ele então vai para 3(distance 5:) para que o barril libere 2 + 5 = 7unidades de radiação. Ele leva 4mais alguns segundos para chegar x = 7onde o barril emitiu 2 + 5 + 4 = 11unidades. Ele leva 19alguns segundos para chegar x = -12onde o barril emitiu 2 + 5 + 4 + 19 = 30unidades. 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
0como 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
stateconsiste- Dois números inteiros
lerque representam um intervalo contíguo na matriz de posição classificada que já visitamos - Um número inteiro
locque nos diz se estamos no ponto final esquerdo ou direito do intervalo - Um número inteiro
timeque 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 costcada 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 costestá baixa não significa que é a resposta ideal para esse subproblema, pois timetambé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.