Participating in competitions has always been a great way for students to show their skills in any field. Unlike standardized tests, most competitions involve skills and training beyond typical coursework, and novel problems that let students show off their technical problem solving ability. Just participating in an advanced Computer Science competition demonstrates dedication to the subject. Seemingly small accomplishments can have a big impact when applying to academic programs or universities!

Competitions in the computer science world range across all grade levels. Several great competitions like the **Beaver Computing Challenge** (**BCC**) don’t involve programming, or they mix in other computer science problems solved on paper, as in the **American Computer Science League** (**ACSL**). However, “competitive programming” usually refers to a specific style of problems where students must use their analysis skills to come up with a precise plan to solve a task, called an **algorithm**, then code a program that processes sets of data based on that plan. These are also called “online judge” problems, since programs are submitted to a website and automatically given a score right away, or “algorithmic programming” contests, since the challenge comes from how good the logical plan is, not from a deep knowledge of any specific programming language.

One international competition sets the standard for this format at the pre-university level: The **International Olympiad in Informatics **(**IOI**). Only the top four students in any country compete in the actual IOI event – truly the Olympics of high school Computer Science! However, the style of the IOI is followed by many other competitions, so there’s lots of opportunity for achievement from elementary school on up.

The remainder of this article will give an overview of three English-language national competitions: The **Australian Informatics Olympiad** (**AIO**), the Canadian Computing Competition (**CCC**), and the **USA Computing Olympiad** (**USACO**). These competitions and others like them share the same overall format, so students can start with whichever version is convenient, and mix and match their training process between all of them. Practice for any one of the three will prepare and improve their skills for the others as well! They’re also easy to participate in, requiring just your computer, your programming skills, and a few hours of time from your home. Much of the content is accessible for free directly through competition websites, and the rest is done with a simple registration process through KTBYTE.

Many families may assume these contests are only for high schoolers, but many students with a little programming knowledge can compete with distinction as early as middle school. Even younger students can check out an example or two with their parents to get a sense of it, and if you’ve taken a KTBYTE class, you might be surprised you can even solve some problems already.

We’ll walk you through the whole process below!

## The Competition Experience

A quick answer to “what’s it like solving competitive programming problems?” is that you’re solving a puzzle. Instead of fitting together jigsaw puzzle pieces, students must think creatively and experiment to fit together small pieces of programming into a large problem-solving machine. In tougher problems, the pieces fit together in ways you didn’t expect at first glance, or require training and familiarity with similar problems to recognize “the right fit” more quickly. Each puzzle is different, so you won’t be able to use exactly the same solution as a previous problem, but they also use the same basic pieces, so instincts and ideas developed through training *will *help you solve future ones. This can be challenging, but it’s also a lot of fun, like solving riddles, escape rooms, or other logic puzzles!

Each problem has a prompt describing the task the program must perform, usually inspired by a real-life concept or scenario. Shown here is part of an introductory problem from the Canadian Computing Competition, which can be solved by creating a programming that “reads input” about how many of each kind of cupcake box is available, then performs a very simple arithmetic calculation to find the answer. The logic in this problem is extremely approachable even for beginner students! Later problems are increasingly complex, requiring not just one but many mathematical, logical, and computational steps. You can see in the code below how simple the logic is to code some solutions – for this problem, just a single calculation on one line.

The goal is for the solution program to get the correct answer for all input possibilities described by the prompt. For example the program could be told there are 10 of each type of cupcake box and give a correct answer (82); then it could run again with 4 regular boxes and 0 small boxes and give a different correct answer (4). Each set of input information is called a “test case”; usually there are 10 or more. Students aren’t told the exact data for test cases while they’re working, only a general format and outline. They also can’t control or make any choices for their program while it’s being tested. Therefore, their programs must work in a general way and process any possible input data correctly and automatically using the correct programming logic.

Once submitted, a solution program is automatically run multiple times, once for each test case. Students get partial credit if their solution produces the correct answer for some test cases, and a perfect score for the problem if all are correct. This is all automatic, and no human grader gives score based on coding style or subjective judgements. Competitors can resubmit solutions to one problem and get an automatic, preliminary score each time, allowing them to refine their answer as they go. These contests are about the *process *of developing an efficient and correct program, not about knowing the answer right away!

Programs must also conform to a few technical requirements. Many first time competitors are intimidated by learning how to create a basic program that works for the competition data format, which must “read” the input data correctly. But this is simply a matter of learning a few lines of “starter code” from examples, so don’t let that stop you from giving it a try! Solution programs must also complete running within a time limit, but this is not a significant factor for the beginner-level competition problems. The time limit varies by contest and problem, but is designed so that more advanced problems require more advanced training and design for their solution to complete within the time limit. Luckily, several different programming languages, including Java, are able to perform these tasks, so most KTBYTE students already have the knowledge to get started.

Each competition has resources on their websites to help get you started. We understand these can be confusing sometimes, so KTBYTE will also continue to publish helpful content, such as our existing USACO blog posts (https://blog.ktbyte.com/category/computer-science-education/usaco/) and additional posts for the AIO and CCC contests coming soon. We’re always happy to talk to you directly if you get stuck or have questions about how to work with these contests!

## Contest Organization

Each contest is run a little differently, so just take your time checking out the details, and get in touch with us for any clarifications! All three competitions work through events run at specific times per year. Students choose a time within each event day or weekend to work for a timed, continuous period of 3-6 hours to solve 3-6 problems without any outside help. Each contests has some kind of scoring or advancement system to recognize student achievement. Some registration tasks can be done through the respective websites, and the rest can be done through KTBYTE or other participating schools.

The AIO is run by the Australian Maths Trust once per year in August. It has a single set of problems for all students, but students receive recognition for their scores in one of two different divisions based on grade level, so younger students don’t need to feel pressured to ace the hardest problems. You can try out practice problems on your own by registering at the practice hub at https://orac2.info/hub/aio/, but for the live competition you’ll need to register with KTBYTE – we’ll provide more details as we get closer to next year’s competition!

The University of Waterloo runs the CCC, also once per year, but in February – coming up soon! For this one, you’ll need to register at https://cccgrader.com, which requires confirmation to participate as a KTBYTE student for practice *and *to actually compete, so get in touch with us right away if you’re interested, and check our emails for updates and suggestions! CCC has Junior and Senior divisions; students can compete in either one, but Junior is recommended for most students who haven’t done competition-specific training. Students who have taken our USACO Silver and above training classes could consider Senior division, but the problems do get very difficult!

USACO is run by volunteers, currently led by Professor Brian Dean of Clemson University. It runs four events per year near the ends of December, January, February, and March. Students register and participate independently from KTBYTE through a simple form on the website, http://usaco.org. The site also provides access to practice with past competition problems. USACO has a more complex advancement system – there are four divisions of competition, Bronze, Silver, Gold, and Platinum, and each gets a different set of problems on each of the four annual events. All competitors start in Bronze division, and those who score particularly well in any event get automatically promoted to the next higher division above their current one, which they’ll compete in starting with the following event. There is no possibility of “demotion” from any division regardless of your performance or participation in any event, and your placement never resets – once promoted, always promoted!

Note that there’s no cumulative scoring across multiple USACO events, so each of the four “contest weekends” per year provides its own chance for promotion. We recommend giving your best effort in all four every time! USACO has also been the most difficult of the contests recently. Solving one or two Bronze problems is already something to be very proud of, let alone getting promoted to Silver or Gold division! USACO participation is beyond what the vast majority of typical high school students do, but is definitely possible for advanced KTBYTE students.

## Next Steps

Now that you have the big picture for the three contests, students should get register and get familiar with individual contests! Remember that if a child doesn’t feel ready to actually participate in the live contest yet, it’s not hard to try out a few practice problems, and we recommend registering with us for the CCC in particular, which allows you to try things out even if you don’t plan to compete for awhile! You may also be surprised that you don’t need to wait until high school to do well in competitions, since even basic coding experience is enough to get started.

Here are some steps to work through:

- First, let us know you’re interested! We can give you access to contest resources through KTBYTE’s school registration for the CCC and AIO, and help out with any problems you run into.
- Pick a contest to learn about first. We recommend the CCC for beginners, but the AIO is also very approachable, and even though the current USACO contest is very challenging, it has a large library of past problems which may be easier, so there’s no real wrong answer. You’ll eventually want to try them all!
- Students can look at instructions and examples on the contest website, as well as KTBYTE guides, to learn the basics on how to create a working program for that competition.
- Pick a simple problem to try on the contest’s practice site. The earlier ones in each round are usually the easiest, and of course you’ll want to start with the first divisions of USACO and CCC.
- Try creating a correct solution, or even a solution that you know
*won’t*work for most test cases, and submitting it! If problems come up, double check the instructions or get in touch with us to help figure things out. This will give you a feel for how the site works and get you used to the specifics needed in the code.

The above steps can all be done whenever you choose to start. When an actual contest event is coming up, you’ll want to:

- Make sure you’re registered with KTBYTE to compete in that specific event, in the case of CCC and AIO.
- Make sure you’ve practiced using the contest website.
- Double check that you’re familiar with the contest rules and starter code for that contest’s problems.
- Have a plan on exactly when during the contest day or weekend you plan to participate.
- Ensure you have a working computer, coding software, internet connection, and quiet space to work.

And of course, in the long term, make sure to keep taking classes and doing more practice to improve your skills over time!

## Online Resources

Check out these resources and links for each competition.

**AIO (Australian Informatics Olympiad):**

- Informational site with the Australian Maths Trust: https://www.amt.edu.au/aio
- Practice hub – register here to begin! https://orac2.info/hub/aio/
- As next August approaches, contact KTBYTE to register for our school team!

**CCC (Canadian Computing Olympiad):**

- Informational site: https://www.cemc.uwaterloo.ca/contests/ccc-cco.html
- Register for KTBYTE’s CCC group: https://www.ktbyte.com/classes/ccc-registration/ccc-registration
- Contest participation site – requires getting login information from KTBYTE first. https://cccgrader.com/
- Past contests – scroll to the bottom for CCC specifically (the University of Waterloo offers many other contests): https://www.cemc.uwaterloo.ca/contests/past_contests.html

**USACO (USA Computing Olympiad):**

- Main page including contest dates and registration form: http://usaco.org/
- Past contest list – you can submit solutions for practice here: http://usaco.org/index.php?page=contests
- Detailed contest rules and instructions: http://usaco.org/index.php?page=instructions
- KTBYTE’s past guides and posts about USACO: https://blog.ktbyte.com/category/computer-science-education/usaco/