JOI/IOI Judgeまとめ

知っているものをまとめてみました。

JOI春合宿

2007

2007年 日本情報オリンピック春合宿OJ | Atcoder

2008

2008年 日本情報オリンピック春合宿OJ | Atcoder

2009

2009年 日本情報オリンピック春合宿OJ | Atcoder

2010

2010年 日本情報オリンピック春合宿OJ | Atcoder

2011

2011年 日本情報オリンピック春合宿OJ | Atcoder

2012

2012年 日本情報オリンピック春合宿OJ | Atcoder

2013

2013年 日本情報オリンピック春合宿 1日目 | Atcoder

2013年 日本情報オリンピック春合宿 2日目 | Atcoder

2013年 日本情報オリンピック春合宿 3日目 | Atcoder

2013年 日本情報オリンピック春合宿 4日目 | Atcoder

2014

2014年 日本情報オリンピック春合宿OJ

2015

2015年 日本情報オリンピック春合宿OJ

2016

2016年 日本情報オリンピック春合宿OJ

IOI

1994

IOI 1994 | Atcoder

1995

IOI 1995 | Atcoder

1996

IOI 1996 | Atcoder

1997

IOI 1997 | Atcoder

1998

IOI 1998 | Atcoder

1999

IOI 1999 | Atcoder

2000

IOI 2000 | Atcoder

2001

IOI 2001 | Atcoder

2002

IOI 2002 | Atcoder

2003

IOI 2003 | Atcoder

2004

IOI 2004 | Atcoder

2005

IOI 2005 | Atcoder

2006

IOI 2006 | Atcoder

2007

IOI 2007 | Atcoder

2008

IOI 2008 | Atcoder

2009

IOI 2009 | Atcoder

2010

IOI 2010 | Atcoder

2011

IOI 2011 | Atcoder

2012

IOI 2012 | Atcoder

2013

IOI 2013 | Baekjoon Online Judge (韓国語)

2014

IOI 2014 | Baekjoon Online Judge (韓国語)

2015

IOI 2015 | Baekjoon Online Judge (韓国語)

2016

APIO

2007

APIO 2007 | Baekjoon Online Judge (韓国語)

2008

APIO 2008 | Baekjoon Online Judge (韓国語)

2009

APIO 2009 | Baekjoon Online Judge (韓国語)

2010

APIO 2010 | Baekjoon Online Judge (韓国語)

2011

APIO 2011 | Baekjoon Online Judge (韓国語)

2012

APIO 2012 | Baekjoon Online Judge (韓国語)

2013

APIO 2013 | Baekjoon Online Judge (韓国語)

2014

APIO 2014 | Baekjoon Online Judge (韓国語)

2015

APIO 2015 | Baekjoon Online Judge (韓国語)

2016

APIO 2016 | Baekjoon Online Judge (韓国語)

JOI予選の提出について

これは Competitive Programming (その2) Advent Calendar 2015 - Adventar11日目の記事です。

高校2年(高専2年)以下を対象とした内容です。


JOI予選まで残り2日となりました。
本選出場を目指して、過去問を解いている人も多いとは思いますが、
本選出場の大きな壁と言われている、解答の提出だけに焦点を当てて書きたいと思います。
(人ごとではない...)

※ここでの提出ミスとはプログラム以外の部分でのミス全般を指すこととします。

提出ミスの種類

提出ミスといってもいくつか種類があります。
主なものとして以下の4つではないでしょうか?

  1. 無駄な文字(BOM等)が入ってしまう場合
  2. 実行時に入力と出力のファイルが一致してない場合
  3. 問題を間違えて提出してしまう場合(2問目の提出に3問目の出力を提出等)
  4. テストケースの番号を間違えて提出してしまう場合(出力2に対して出力3を提出等)

出力時の対策(C/C++向け)

提出ミスの種類の1,2がこれに当たります。

まず、コピペして出力ファイルを作成すると無駄な文字が入ってしまう可能性が高まります。
その失敗を防ぐためプログラムから直接書き込むようにしましょう。

方法としては、

  1. リダイレクト
  2. freopen
  3. fscanf,printf

が考えられます。(上から順にオススメ)

1.リダイレクト

ターミナル・コマンドプロンプトCUI環境での実行時に行えます。

LinuxMacOSX

./a.out < in.txt > out.txt

Cygwin

./a.exe < in.txt > out.txt
2. freopen

プログラム内で対応。IDEでも可。

//プログラムの先頭に記述
freopen("./in.txt","r",stdin);
freopen("./out.txt","w",stdout);

//入出力は普段通り、以下のように記述
scanf("%d",&a);
printf("%d\n",&ans);
puts("Yes");
3. fscanf,printf

プログラム内で対応。IDEでも可。

//プログラムの先頭に記述
FILE *fin = fopen("./in.txt","r");
FILE *fout = fopen("./out.txt","w");

//入出力を以下のように記述
fscanf(fin,"%d",&a);
fprintf(fout,"%d\n",ans);


これで、直接書き出せるようになりました。
しかし、入力と出力のファイルの指定を間違えるかもしれません。
そこで、問題番号の指定だけで5つのファイルに対して実行してくれるようにしてみましょう。

リダイレクトを使用する

第一引数として問題番号を与える
例) ./run.sh 3  (3問目に対して実行)

LinuxMacOSX

for lo in 1 2 3 4 5
do
time ./a.out < 2016-yo-t${1}-in${lo}.txt > 2016-yo-t${1}-out${lo}.txt
done

Cygwin

for lo in 1 2 3 4 5
do
time ./a.exe < 2016-yo-t${1}-in${lo}.txt > 2016-yo-t${1}-out${lo}.txt
done

 

提出時の対策

提出するファイルが完成したら、次は提出です。
提出ミスの種類の3,4がこれに当たります。

出力ファイル名は問題番号名と入力ケース番号を含む同じ形になっていると良いです。
提出時に一目でわからない様であれば提出ミスが増えます。

例1) out3-1.txt out5-2.txt (1問目の出力1,3問目の出力2)
例2) 2016-yo-t3-out1.txt 2016-yo-t5-out2.txt (1問目の出力1,3問目の出力2)
※先ほどの実行用シェルスクリプトを使うと例2のようになります。


提出してみます。

f:id:goodbaton:20151207165405p:plain

提出するとダウンロードができるようになりますね。

そのダウンロードをクリックすると、
練習 ... J160000XX-pr-t1-out1.txt
予選 ... J160000XX-yo-t1-out1.txt
のように以下の名前の付け方でダウンロードされます。
[ID]-[練習or予選]-t[問題番号]-out[ケース番号].txt

ソースコードは[ID]-yo-t[問題番号]-program.[拡張子]


全てのデータに対して比較をしてあげれば良いわけです。

LinuxMacOSXCygwin
例) ./diff.sh 3  (3問目に対して実行)

id=J160000XX

diff -s q$1.cpp $id-yo-t$1-program.cpp
for lo in 1 2 3 4 5
do
diff -s 2016-yo-t$1-out$lo.txt $id-yo-t$1-out$lo.txt
done

これで全てが一致していれば提出はミス無く完了です。

自分の構成

最後に本番で使用予定の構成を書いておきます。
参考程度に見てください。

OS : MacOSX (Linuxも同様)

run.sh
year=2016
con=yo

rm ./joi-$1
g++ q$1.cpp -Wall -std=c++0x -O2 -o joi-$1

for lo in 1 2 3 4 5
do
time ./joi-$1 < $year-$con-t$1-in$lo.txt > $year-$con-t$1-out$lo.txt
cp -f $year-$con-t$1-out$lo.txt ../diff/
done
diff.sh
year=2016
con=yo
id=J160000XX

diff -s q$1.cpp $id-$con-t$1-program.cpp
for lo in 1 2 3 4 5
do
diff -s $year-$con-t$1-out$lo.txt $id-$con-t$1-out$lo.txt
done

まとめ

  • 予選は提出ミスに気を付けましょう
  • 規則的なファイル名の付け方をしましょう
  • できる限りケース番号の指定は手作業で行うのは止めましょう。
  • 提出後に確認を行いましょう
  • 目視での確認も忘れずに