algorithmic problem solving