概要
- AIZU ONLINE JUDGEを使用。
- ICPC国内予選の問題(Volume 11)の3番目まではどの年の問題でも最低限解けるようにするのが目標。
- 他にも、"Course"タブに使うアルゴリズムごとに別れた問題があるのでそれをやってもいいかも。
ICPC国内予選の3問目までと言うのは、特に難しいアルゴリズムの問題が出るわけではないので、バグを生みにくいくてサクッと書ける綺麗なコード設計をする良い練習になる。
具体的には以下の様な特徴がある。
- 1問目はやるだけの問題。if文、ループ、配列を使った基本的な操作ができればいいものが多い。
- 2問目は少し複雑な実装問題で、データをどう持つかなどの設計力が問われる。
- 3問目は大抵、再帰構造が書けるかどうかが問われる問題が出る
システムに慣れる
ユーザー登録
まずはRegistration。自分はAffiliationにカンマを入れたら登録できなかった。
ソースコードなんて隠しても仕方ないのでSource Code Policy(提出ソースコードの公開)をpublicにする。
言語選び
使える言語とバージョンは以下のページに書いてある。
例えば、Cで1秒で終わるプログラムがRubyだと10秒かかるなどということもあるので、言語間でタイムリミットやメモリリミットにハンデが付けられている。
この表によるとRubyはCの5倍遅いプログラムでも大丈夫らしい。
実際に提出してみる
あっているプログラムが書けても、出し方が間違っていてうまくいかないこともあるのでまずは、
Hello World (出力のみ)
を出してみる。C/C++/Javaに関しては答えがあるので、そのままコピペで出してみれば良い。
Javaの人はClass名をMainにしないと通らないので注意。
Rubyの場合は
puts "Hello World"
でOK。
もう少し肩慣らし
先ほどの問題は入力を取らなかったので、入力の取り方も含め以下の
問題で肩慣らしする。
X Cubic 1行1入力
Rectangle 1行2入力
Standard Deviation 複数入力
ここにある問題は基本的に全て入力は標準入力からとって、標準出力に答えを吐き出す形式なのでとりあえず使う言語の標準入出力のやり方を調べると良い。
言語のバージョンなどは少し情報が古いが、ここにいろいろな言語の書き方がまとまっている。
今流行りのエディタSublimeText2を使って、AOJで競技プログラミングを楽しもう
ローカルでのRubyの実行の仕方
textファイルを作って入力をコピー
5
70 80 100 90 20
3
80 80 80
0
以下のように実行
$ ruby Standard_Deviation.rb < in.txt
Rubyでの解答例
こんなところで詰まってもしかたがないと思うので解答例を書いておく
X_Cubic
puts gets.to_i ** 3
Rectangle
a, b = gets.split.map(&:to_i)
puts [a*b, (a+b)*2].join ' ' # puts "#{a*b} #{(a+b)*2}"
(scanf/printfを使ったパターン)
require 'scanf'
a, b = gets.scanf("%d %d")
printf("%d %d\n", a*b, (a+b)*2)
Standard Deviation
while (n = gets.to_i) != 0 do
ss = gets.split.map(&:to_i)
m = ss.reduce(:+).to_f / ss.size
alpha_2 = ss.map{|s| (s - m) ** 2}.reduce(:+) / ss.size
puts Math.sqrt(alpha_2)
end
map
, reduce
で書いてる部分はどうでもよくて、覚えて欲しいのは
while (n = gets.to_i) != 0 do
の部分。この形はよく使うはず。
gets.split.(&:to_i)
というパターンもよく使う。
引数なしのsplit
は優秀なので気づかないかもしれないがgets
の結果は最後の改行が含まれるので、gets.split
かgets.chomp
のどちらかで使うこと
結果の見方
いきなり上手く行けばAccepted
となるが、結構そうは行かない。
答えが間違っているのはWrong Answer
だが、それ以外の問題も結構あるCompile Error
, Runtime Error
, Time Limit Exceeded
などそれぞれの判定結果の意味は以下のページで知れる。
もっと練習したい人
もう少しやりたい人は
のコースの中から選んで見ると良いかも。
1回目
誰もICPCをやったことがなかったので、現状最新の2013年度から行く。
日本語もあるので、日本語でやりたい人は日本語でOK
ICPCは言語がC,C++,Javaに固定されているがここはなんでもOK
WantedlyはRubyを使っているのでRubyでやるのがいいかも
while (line = gets) do
h, w = line.split.map(&:to_i)
break if h == 0 && w == 0
# your code here
end
loop do
# RubyではM,T,R,Pと大文字にすると定数になるため同じ文字を重ねた
mm, tt, pp, rr = gets.split.map(&:to_i)
break if mm + tt + pp + rr == 0
# your code here
end