In undergrad, I participated in the ACM Programming Contest every year. Without knowing my rationale, I always thought it was good for me (and would really try to get other people to come out).
This morning I realized why: it’s good practice! Often, people would point out how contrived the problems were, or how graph theory wasn’t particularly relevant to the kinds of things they wanted to work on when they were done school. The fact is, the more you work on the really hard problems, the easier the easy problems get.
[I want to talk more about this, but I'm in a testing cycle. This is part teaser, part reminder that I need to elaborate on this subject]