We can simulate the pours one by one, keeping track of the amount of milk in each bucket. For example, if we pour from bucket $1$ into bucket $2$, and bucket $1$ has size $c_1$ and bucket $2$ has size $c_2$, and before the pour, bucket $1$ has $m_1$ units of milk and bucket $2$ has $m_2$ units, then the amount of milk poured is $\min(m_1, c_2 - m_2)$. Therefore after the pour, the amount of milk in bucket $1$ is $m_1 - \min(m_1, c_2 - m_2)$. And the amount of milk in bucket $2$ is $m_2 + \min(m_1, c_2 - m_2)$. The formulas for pouring bucket $2$ into bucket $3$, or bucket $3$ into bucket $1$, are analogous.
Since there are only $100$ pours, and each pour takes only a constant number of arithmetic operations to simulate, this algorithm will run very fast.
Here is Travis Hance's code:
#include <cstdio> #include <algorithm> using namespace std; void pour(int& c1, int& m1, int& c2, int& m2) { int amt = min(m1, c2 - m2); m1 -= amt; m2 += amt; } int main() { int c1, c2, c3; int m1, m2, m3; scanf("%d %d", &c1, &m1); scanf("%d %d", &c2, &m2); scanf("%d %d", &c3, &m3); for (int i = 0; i < 33; i++) { pour(c1, m1, c2, m2); pour(c2, m2, c3, m3); pour(c3, m3, c1, m1); } pour(c1, m1, c2, m2); printf("%d\n%d\n%d\n", m1, m2, m3); }