最終更新日時: 2017-09-25 (月) 16:19:29 このページは随時改訂されます。また、質問や回答はSupercomputing Contest 2012/予選・認定問題Q&Aにまとめていきますので合わせてご覧ください。 SuperCon 2012 予選問題および認定問題 †
ナップサック問題とその変形: ナップサック問題というものがあります。これは、ある容量のナップサックと体積と価値の定められたいくつかの品物があるとき、容量を越えないように品物をナップサックに詰め込み、ナップサック内の品物の価値の和をどれだけ大きくできるかという問題です。今年のSuperConの予選問題は、この「ナップサック問題」に文字列を取り入れた問題です。以下Webの制約から下つきの記号"_"が付いたままとなっていますが,正しくは上の印刷用PDF版をご覧ください。 以下、まず文字列についていくつかの定義を与えます。 (1)文字列A,Bに対してAとBを連結した文字列を A+B で表すことにします。例えば、 A="super", B="con"に対して、A+B="supercon", B+A="consuper" となります。数値の演算記号+と異なり,ここでの文字列の連結記号+には順番があることに注意してください。 (2)文字列Aに対してAの長さを |A| で表します。空文字列の長さは0です。例えば、 A="supercon"に対して、|A|=8 です。 (3)文字列Aに対してAのi文字目を A(i) で表します。例えば、 A="supercon"に対してA(1)=s, A(2)=u, ..., A(8)=n となります。 (4)文字列A,Bに対して、辞書式順序でAがBより大きくないということを A ≦ B と表記します。ここでは,A ≦ Bであることの厳密な条件は、 (a) A(i) ≠ B(i)であるような最小の i (1 ≦ i ≦ Min(|A|,|B|)、Min(X,Y)はX,Yのうち大きくない方)が存在してASCIIコードの比較(アルファベット順)でA(i) < B(i) であるか、 (b) A(i) ≠ B(i)であるようなiが存在せず|A| ≦ |B| であるとします。 例えば、(a)の場合の例は "con" ≦ "super"、"superaon" ≦ "superconconcon"、"superabcdefg" ≦ "superb" などです。上の2つ目の例 A="superaon"とB="superconconcon"の場合、最初から5文字までは同じで、6文字目に初めて違いがあるので、違いの出る最小の i は6となります(A(6)≠B(6))。そして、6文字目のASCIIコードを比較すると、A(6)=aはB(6)=cより小さいので、"superaon"≦ "superconconcon"となります。この場合は7文字目以降がどんな文字列でも、またどれだけ長くても比較には影響しないことに注意してください。また、 (b)の場合の例は "super" ≦ "supercon", "super" ≦ "super", (空文字列) ≦ "supercon" などです。 SuperCon2012 予選・認定問題 今回の予選・認定問題では、それぞれ文字列WおよびN個の文字列w_0, w_1, ..., w_{N-1}と整数v_0, v_1, ..., v_{N-1}が与えられます。Wはナップサックの容量に対応し、v_iはi番目の文字列w_iの"価値"です。問題は、N個の文字列から何個かを選んで、以下の条件を満たすように(辞書式順序でWより大きくならないように)結合し、なるべく価値の合計が高い文字列を作るというものです。つまり、これらの入力に対して, w_{S_0} + w_{S_1} + ... + w_{S_{k-1}} ≦ W (k≦N)および 0 ≦ S_0 < S_1 < ... < S_{k-1} < N を満たすような整数列S=(S_0, S_1, ...,S_{k-1})を選んで、対応する整数V_iの和 V=v_{S_0} + v_{S_1} + ... +v_{S_{k-1}} のとりうる最大値を求めてください。なお、整数列Sは長さ0でも構いません。(空文字列) ≦ Wなのでそのような選び方はいつでも制約を満たし、そのときにはV=0ということになります。 各級の認定と予選の問題については以下の制約に従うものとします。 問A (スーパーコン3級認定問題 2012年度版) †
ヒント:この問題は可能な文字列の結合全ての総当りが可能です。上記の条件を満たす問題例10題に対して全て,Vの最大値を正しく求めた場合にスーパーコン3級を認定します。 問B (スーパーコン2級認定問題 2012年度版) †
ヒント:この問題は可能な文字列の結合全ての総当りはできません。上記の条件を満たす問題例10題に対して全て,Vの最大値を正しく求めた場合にスーパーコン2級を認定します。 問C (スーパーコン予選問題 兼 1級認定問題 2012年度版) †
上記の条件を満たす問題例10題に対して全て,Vの最大値を正しく求めた場合にスーパーコン1級を認定します。 注意 †
詳細説明 †問題例の与え方 †問題例は以下のように与えられます。 N W v_0 w_0 v_1 w_1 ... v_{N-1} w_{N-1} 例えば N = 3 W = jihgfedcb (w_0, w_1, w_2) = (jih, adgfi, ghe) (v_0, v_1, v_2) = (10, -3, 5) に対する入力は次のようになります。 3 jihgfedcb 10 jih -3 adgfi 5 ghe この場合、v_1=-3(負)なので、一見w_1は選ばない方がよいように思えますが、v_2=5なのでw_2も選ぶことによりVをw_0だけ選ぶときの値V=v_0=10よりも大きな値V=10-3+5=12にすることができ、V=12が正解となります。w_1を選ばずにw_0とw_2だけを選んでV=v_0+v_2=10+5としたいところですが、w_0+w_2=jihgheとなってw_0+w_2≦Wの条件を満たさなくなってしまうので、そのような選び方はできないことにも注意してください。また、N=3, W=jihgfedcb, (w_0, w_1, w_2)=(jih, adgfi, ghe), (v_0, v_1, v_2)=(10,-3,2)の場合には、w_0だけを選ぶのがVを最大にするので、V=10が正解です。 雛形プログラムについて †雛形プログラムでは、上記の入力問題例のデータをそれぞれ以下のようにint型のN, char型の配列W, char型の2次元配列w, int型の配列vに格納します。それらを用いて「変更可能」とコメントされている範囲にプログラムを書いてください。 N=3 W="jihgfedcb" w[0] = "jih" w[1] = "adgfi" w[2] = "ghe" v[0] = 10 v[1] = -3 v[2] = 5 改訂履歴 †
|