Um sistema que estou construindo inclui um conjunto de controles deslizantes da interface do usuário (o número varia), cada um com uma escala de 0 a 100. Por slider, quero dizer uma interface do usuário onde você pega um elemento e o arrasta para cima e para baixo, como um controle de volume. Eles são conectados por um algoritmo que garante que sempre totalizem 100. Portanto, quando um controle deslizante é movido para cima, todos os outros se movem para baixo, eventualmente para zero. Quando um é movido para baixo, os outros sobem. O total deve sempre ser 100. Portanto, aqui os controles deslizantes têm vários valores, mas totalizam 100%:
----O------ 40
O---------- 0
--O-------- 20
--O-------- 20
--O-------- 20
Se o primeiro controle deslizante for UP de 40 para 70, os outros deverão mover o valor DOWN (à medida que o controle deslizante é arrastado). Observe que três controles deslizantes foram alterados de 20 para 10 e um permaneceu em zero, pois não pode diminuir.
-------O--- 70
O---------- 0
-O--------- 10
-O--------- 10
-O--------- 10
É claro que quando qualquer controle deslizante atinge 0 ou 100, ele não pode se mover mais, e é aí que minha cabeça realmente começa a doer. Portanto, se um controle deslizante se move mais alto, os outros se movem mais baixo, mas quando algum deles chega a zero, apenas os demais que ainda não atingiram o zero podem se mover mais baixo.
Estou perguntando isso aqui, pois esta questão é específica para o algoritmo, não para a implementação. FWIW, a plataforma é Android Java, mas isso não é especialmente relevante.
A abordagem adotada com minha primeira punhalada foi calcular a alteração percentual do controle deslizante que se moveu. Dividi essa alteração e a apliquei (na outra direção) aos outros valores do controle deslizante. O problema, porém, é que, usando porcentagens e multiplicando, se algum controle deslizante chegar a zero, ele nunca poderá ser aumentado novamente de zero - o resultado líquido disso é que controles deslizantes individuais ficam presos em zero. Usei controles deslizantes com um intervalo de 0 a 1.000.000 para evitar problemas de arredondamento e isso parece ser útil, mas ainda não criei um algoritmo que lide bem com todos os cenários.