Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Contest Algorithms
January 2016
1. Introduction
Dr. Andrew Davison
Dept. of Computer Engineering
Prince of Songkla University
ad@fivedots.coe.psu.ac.th
Contest Algorithms
1
Prerequisites
Knowledge of Java
e.g. 241-211. Object Oriented Programming
Intro to big-Oh and algorithms
e.g. 241-303 / 242-313 Discrete Mathematics
242-310 Intro to Algorithms and Complexity
Contest Algorithms
2
Why Compete?
Makes you a better programmer and thinker in many
situations
Develop skills that will set you apart in the workforce
It's fun
Contest Algorithms
3
ACM-ICPC
ICPC is a tiered competition among teams of students
representing institutions of higher education.
Teams compete in local contests, then Regional Contests,
from which top scoring teams advance to the ACM-ICPC
World Finals
4
Contest Algorithms
5
Format:
3 people
1 computer
5 hours
10 problems
25 page team reference document
Rules:
http://www.acmicpc-thailand.org/asia/2015/contest
https://icpc.baylor.edu/
Contest Algorithms
6
What is ACM?
ACM: Association for Computing Machinery
http://www.acm.org/
the world’s largest educational and scientific computing society
ACM ICPC
ACM International Collegiate Programming Contest
http://en.wikipedia.org/wiki/ACM_International_Collegiate_Progr
amming_Contest
7
Teamwork
Know your teammates
Delegating problems to each other
Share the computer time effectively
Create test cases for each other
Communicate well
Pair programming
Contest Algorithms
8
Producing Winning Solution
Write a team programming plan
Read through all the problems first
Order the problems: shortest first, in terms of your effort
Outline the algorithms,data structures, tricky details
Do the math! (space & time complexity)
Write the code to be fast and correct
Try to break the algorithm - use tricky test cases
9
Problem Statement/Recipe
Problem description/statement
can be unnecessarily long or misleading
Input and output description
usually very precise
assume that all input will be formatted like this
Sample input and output
one or more inputs and expected outputs
Contest Algorithms
10
Quickly identify problem types
Complete search
also known as brute force
backtracking
Divide and conquer
Graph
traversal
minimal spanning tree (MST)
shortest paths
maxflow
Contest Algorithms
Searching / Sorting
Dynamic programming
Greedy
Maths
number theory, big integer, etc
String processing
Computational geometry
11
Coding a Problem
Brute force algorithm tends to be the easiest to
implement.
KISS: Keep It Short & Simple
Use more memory space if it makes the code faster
Don't delete your debugging output, comment it out
Optimize step-by-step, and only as much as needed
Keep all working versions
12
Only start coding after you decide on the algorithm
Code the input routine and test it
write extra output routines to show data
Code the output routine and test it
Write comments outlining the program logic
Code and debug one section at a time
13
Coding style:
white space is good
use meaningful variable names
develop code in small steps
add useful comments
Try not to use floating point, or be aware of inaccuracy
e.g. instead of $12.34, use 1234 cents
double x = ...;
if (x == 4) // bad
if (Math.abs(x-4) < 1e-9) // good
14
Steps to solving a problem
Read the problem
Decide whether or not you know how to solve it
If you think you can solve it:
Parse the input
Write the code
Check that the program works on the sample input/output
Submit!
If you're not sure, move onto the next problem
Contest Algorithms
15
Parts to a (OLD style IO) Program
import java.io.*;
public class Main
{
public static void main(String[] args) // throws Exception
{
BufferedReader in =
new BufferedReader(
new InputStreamReader(System.in));
int nCases = Integer.parseInt(in.readLine());
for (int caseNum = 0; caseNum < nCases; caseNum++) {
// Parse the input number
int n = Integer.parseInt(in.readLine());
:
Contest Algorithms
16
:
// Calculate the answer n
n /= 9;
n += 7492;
n *= 235;
n /= 47;
n -= 498;
*=
567;
// Digit in the tens column
int tens = (n / 10) % 10;
System.out.println(tens);
}
} // end of main()
}
// end of Main class
Contest Algorithms
17
Parsing String to int
public static int parseInt(String s)
{
if (s == null)
return 0;
try {
return Integer.parseInt(s);
}
catch (NumberFormatException ex){
System.out.println(s + " could not be parsed
as an int; using 0");
return 0;
}
} // end of parseInt()
Contest Algorithms
18
Two modern ways
Scanner s = new Scanner(System.in);
while (s.hasNextLine()) {
String line = s.nextLine();
// process line ...
}
Console r = System.console();
String line = null;
while ((line = r.readLine()) != null) {
// process line ...
}
use this one
Adding Two Numbers
see ScannerAdd.java
import java.util.Scanner;
public class ScannerAdd // use Main in contests
{
public static void main(String[] args) throws Exception
{
Scanner s = new Scanner( System.in );
System.out.print("Enter first integer: ");
int x = s.nextInt();
System.out.print("Enter second integer: ");
int y = s.nextInt();
s.close();
System.out.println("Adding gives: " + (x+y) );
}
} // end of ScannerAdd class
Contest Algorithms: 1. Intro
20
Compile & Execute
Contest Algorithms: 1. Intro
21
Adding any number of Numbers
import java.io.*;
import java.util.Scanner;
see AddDoubles.java
public class AddDoubles
// use Main in contests
{
public static void main(String[] args) throws Exception
{
double total = 0;
Scanner sc = new Scanner(System.in);
while ( sc.hasNextDouble() )
total += sc.nextDouble();
sc.close();
System.out.println("Total = " + total );
}
} // end of AddDoubles class
Contest Algorithms: 1. Intro
22
Compile & Execute
ctrl-D and
<enter>
Contest Algorithms: 1. Intro
inaccuracy in
floating point
23
Fill
an
Integer
Matrix
import java.io.*;
see UseGraph.java
import java.util.*;
public class UseGraph // use Main in contests
{
public static void main(String[] args) throws Exception
{
Scanner sc = new Scanner(System.in);
// Scanner sc = new Scanner(new File("graphData.txt"));
testing
// for
int numVs = sc.nextInt();
int[][] adjMat = new int[numVs][];
for (int i = 0; i < numVs; i++) {
adjMat[i] = new int[numVs];
for (int j = 0; j < numVs; j++)
adjMat[i][j] = sc.nextInt();
}
Contest Algorithms
:
// use numVs as no. of rows
// create ith row array
// fill row
24
// print it out
for (int i = 0; i < numVs; i++) {
for (int j = 0; j < numVs; j++)
System.out.printf(" %3d", adjMat[i][j]);
System.out.println();
}
System.out.println();
} // end of main()
}
// end of UseGraph class
Contest Algorithms: 1. Intro
25
Compile & Execute
Reading from graphData.txt
Contest Algorithms: 1. Intro
26
graphData.txt
6
0 10
0 0 100 0
10 0 7 0 8 0
0 7 0 9 0
0
0 0 9 0 20
5
100 8
0 20 0 0
0 00 5 00
Contest Algorithms
27
Reading Data Using Scanner
java.util.Scanner
+Scanner(source: File)
Creates a Scanner that produces values scanned from the specified file.
+Scanner(source: String)
Creates a Scanner that produces values scanned from the specified string.
+close()
Closes this scanner.
+hasNext(): boolean
Returns true if this scanner has another token in its input.
+next(): String
Returns next token as a string.
+nextByte(): byte
Returns next token as a byte.
+nextShort(): short
Returns next token as a short.
+nextInt(): int
Returns next token as an int.
+nextLong(): long
Returns next token as a long.
+nextFloat(): float
Returns next token as a float.
+nextDouble(): double
Returns next token as a double.
+useDelimiter(pattern: String):
Scanner
Sets this scanner’s delimiting pattern.
28
Java's printf()
Almost the same as C's printf().
The main formating operations:
Contest Algorithms
Format specifier
Description
%d
Displays a decimal (base 10 ) integer
%f
Display a floating point value in decimal format
%e or %E
Display a floating point number in exponential
notation
%c or %C
%s or %S
%b or %B
%%
Display characters
Display Strings
Display boolean values
Display a % sign
29
More information on printf
1 page quick reference:
https://www.cs.colostate.edu/~cs160/.Fall15/resources/Java_pri
ntf_method_quick_reference.pdf
More words, but still 1 page:
http://www.javawithus.com/tutorial/displaying-text-using-printfmethod
Contest Algorithms
30
Template for ICPC Online Judge
import java.util.Scanner;
see Main.java
public class Main {
// save as Main.java
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int
i = in.nextInt();
double d = in.nextDouble();
https://www3.ntu.edu.sg/home/
ehchua/programming/
icpc/icpc_getting_started.html
String s = in.next();
// There is no nextChar(), use next() and charAt()
char c = s.charAt(2); // third char
// Read whole line (or rest of the line past '\n')
String line = in.nextLine();
System.out.printf("%4d, %6.2f, %s, %c\n", i, d, s, c);
// Use %f for double (not %lf)
// Don't forget to print the '\n'
}
Contest Algorithms
}
31
Contest Algorithms: 1. Intro
32
Scanner is a bit Slow
https://www.cpe.ku.ac.th/~jim/java-io.html
I created a file of 10,000 random integers (in
nums10000.txt)
ScannerTest.java
Scanner takes 80 - 90 ms to read in all the values
I have found two alternatives to Scanner:
Kattio.java (https://open.kattis.com/download/Kattio.java)
FastIntScanner.java (http://codeforces.com/blog/entry/21125)
Their speeds:
Kattio: 15 - 25 ms
FastIntScanner: 5 – 20 ms
Contest Algorithms: 1. Intro
33
Kattio
Kattio.java
It uses Java's BufferedReader and StringTokenizer classes
for input
Also uses PrintWriter for output, to replace
System.out.println()
Offers:
hasNext(), nextInt(), nextDouble(), nextLong(), next()
no nextLine()
See the test client at the end of the class
Contest Algorithms: 1. Intro
34
FastIntScanner
FastIntScanner.java
It uses only Java's BufferedReader and implements its own
tokenizer for integers.
It does not use PrintWriter for output
Offers:
hasNext(), nextInt(), next(), nextLine()
no nextDouble(), nextLong()
Contest Algorithms: 1. Intro
35
Analyze your algorithm
Is your algorithm correct?
What is its time/space complexity?
Given the maximum input (usually given in the problem),
can your algorithm stay inside the time limit for the
contest?
36
Some rules of thumb
The biggest Java integer data structure long can store
263-1 ≈ 9*1018 (up to 18 digits)
If you have k nested loops, each doing about n
iterations, then the program has O(nk) runtime
The best times for sorting n elements is O(n log n)
quicksort, mergesort
use Java’s Arrays.sort()
37
More info:
https://docs.oracle.com/javase/tutorial/java/
nutsandbolts/datatypes.html
Java Primitive Types
2 x 109
9 x 1018
Contest Algorithms:12. Maths
38
Dynamic programming algorithms involving a table/matrix
usually have O(n3) runtime
Aim to use O(n log n) algorithms
e.g. binary search
Java’s Array.binarySearch()
Contest Algorithms
39
Testing your code
The sample input in the problem description is usually too
simple for testing
Design tricky test cases, test them on your machine.
Boundary cases
Big input
Badly formatted input
Random test cases
40
Judged code
There are many ways to fail:
Presentation Error (PE)
Wrong Answer (WA)
Compile Error (CE)
Runtime Error (RTE)
Time Limit Exceeded (TLE)
Memory Limit Exceeded (MLE)
Contest Algorithms
Submission Error (SE)
Output Limit Exceeded (OL)
Restricted Function (RF)
41
Meanings
Accepted (AC) – Congratulations!
Accepted (PE) – Your program has a minor presentation
error, but the judge is letting you off with a warning.
Stop here and declare victory!
Presentation Error (PE) – Check for spaces, left/right
justification, line feeds, etc.
Contest Algorithms
42
Wrong Answer (WA) – Your program returned an incorrect
answer to one or more secret test cases.
Compile Error (CE) – The compiler could not figure out how
to compile your program.
The resulting compiler messages will be returned to you.
Warning messages are ignored by the judge.
Runtime Error (RTE) – Your program failed during execution
due to a segmentation fault, floating point exception, or
similar problem.
Check for invalid pointer references or division by zero.
Contest Algorithms
43
Submission Error (SE) – You did not correctly specify one or
more of the information fields, perhaps giving an incorrect
user ID or problem number.
Time Limit Exceeded (TL) – Your program took too much
time on at least one of the test cases, so you likely have a
problem with efficiency.
Memory Limit Exceeded (ML) – Your program tried to use
more memory than the judge’s default settings.
Contest Algorithms
44
For Java, the judges compile and execute your code
using:
javac -encoding UTF-8 -sourcepath . -d . $*
java -client -Xss8m -Xmx1024m $*
thread stack size
for storing its local
execution state
max heap size
for object creation
see https://icpc.baylor.edu/worldfinals/programming-environment
Contest Algorithms
45
Output Limit Exceeded (OL) – Your program tried to print
too much output, perhaps trapped in a infinite loop.
Restricted Function (RF) – Your source program tried to use
an illegal system function. Probably a file operation.
Contest Algorithms
46
Verdict by Language
from "Programming Challenges", Skiena, 2003;
Java only allowed 1 year before
Contest Algorithms
47
Java Team Contest Reference Docs
https://github.com/alexjbest/icpc-tcr
University of Warwick TCR docs
https://github.com/i8r/icpc-tcr
University of of Lübeck, Germany
Contest Algorithms
48
TCR Doc Rules
Each contestant may bring a copy
Up to 25 pages of ref materials, single-sided, letter or
A4 size, with pages numbered in the top right-hand
corner and your university name in the top left-hand
corner.
It may include hand-written comments and
corrections on the fronts of pages only.
In a notebook or folder with the name of your
institution on the front
Contest Algorithms
49
Generating a TCR Doc
Write code using a programming font in a text editor with
color highlighting:
e.g. Source Code Pro
https://github.com/adobe-fonts/source-code-pro
e.g. Notepad++
https://notepad-plus-plus.org/
Use fineprint printer driver to print 4 or 8 pages/sheet:
http://fineprint.com/fp/
Contest Algorithms
50
Do not combine all the code files into one
it makes it harder to change, test, regenerate the TCR
Install the "Print all" plugin into Notepad++
Go to Plugins -> Plugin Manager -> Show Plugin Manager, then
click on Available, then go down to Print all, check it, and install
Contest Algorithms
51
ICPC Help
https://www3.ntu.edu.sg/home/ehchua/programming/ic
pc/icpc_getting_started.html
http://umass.acm.org/interest-groups/acm-icpc/
acm-icpc-resources/
http://www.ahmedshamsularefin.id.au/
acm-icpc/tutorials/16-links
great collection of links
https://en.wikipedia.org/wiki/
ACM_International_Collegiate_Programming_Contest
links to blogs, training
Contest Algorithms
52
Practice
Talking about programming contests only get you so far
Past problems:
https://icpc.baylor.edu/worldfinals/problems
UVa Online Judge
http://uva.onlinejudge.org
TopCoder
http://topcoder.com
Project Euler
http://projecteuler.net/
Contest Algorithms
53
Available Online Judges (OJs)
There are many famous online judges
Valladolid OJ (http://acm.uva.es/p)
Ural OJ (http://acm.timus.ru)
Saratov OJ (http://acm.sgu.ru)
ZJU OJ (http://acm.zju.edu.cn)
ZJUT OJ (http://acm.zjut.edu.cn)
Official ACM Live Archive (http://cii-judge.baylor.edu/)
Peking University Online Judge
(http://acm.pku.edu.cn/JudgeOnline/)
Programming Challenges
(http://www.programming-challenges.com)
54
Other Programming Contests
TopCoder
Weekly online individual competitions
Google Code Jam
Internet Problem Solving Competition
Annual, fun, diferent style of problems
IOI, USACO
Contest Algorithms
55
Textbooks
Competitive Programming
Steven and Felix Halim, Third Edition
http://cpbook.net/
Programming Challenges
Steven S. Skiena and Miguel Revilla
http://www.programming-challenges.com/
Contest Algorithms
56
From Baylor to Baylor
Miguel A. Revilla
https://icpcarchive.ecs.baylor.edu/
Contest Algorithms
57
Intro to Java Programming,
Comprehensive, 10th ed.
Y. Daniel Liang
http://www.cs.armstrong.edu/liang/intro10e/
Topics
2D arrays, String, BigInteger, bitwise ops,
regexs
Generics, Collections (lists, stack, queues,,
sets, maps)
Sorting, searching
graph algorithms (2 chapters)
Contest Algorithms
58
Algorithms, 4th ed.
Robert Sedgewick, Kevin Wayne
http://algs4.cs.princeton.edu/
Introduction to Algorithms, 3rd ed.
Thomas Cormen, Charles Leiserson,
Ronald Rivest, Clifford Stein
lots of resources online;
see video section
Contest Algorithms
59
การออกแบบและวิเคราะห์อลั กอริทมึ
ผูแ้ ต่ง : สมชาย ประสิทธิ์จูตระกูล
http://www.chulabook.com/
http://www.cp.eng.chula.ac.th/~somchai/books/
โครงสร้างข้อมูลและอัลกอริทมึ
Data Structures and Algorithms)
ผูแ้ ต่ง : สุธี พงศาสกุลชัย
&
ณัฐพงษ์ วารีประเสริฐ
http://ktpbook.com
Contest Algorithms
60
Videos
MIT 6.046J / 18.410J Intro. to Algorithms, Fall 2005
http://ocw.mit.edu/6-046JF05
original course website for Cormen book
http://videolectures.net/mit6046jf05_introduction_algorithms/
video and slides side-by-side
http://www.catonmat.net/
category/introduction-to-algorithms
notes taken while
watching the videos
Skiena's Algorithms Lectures
http://www3.cs.stonybrook.edu/~algorith/video-lectures/
1997, 2007, 2012
Contest Algorithms
62
Eclipse tutorials:
http://eclipsetutorial.sourceforge.net/totalbeginnerlessons.html
16 videos
uses v3.3 (current is 4.5) from 2007
Various Youtube videos:
Eclipse IDE Tutorial, luv2code (many videos)
Eclipse IDE Tutorial, Norm Krumpe
Contest Algorithms
63