JOI’95 予選 問題3 解答・解説

問題3 正解 (2点 = (a)(b)各1点)

      (a) C       shiryo--,   shiryo -= 1,    shiryo = shiryo-1    など
          Pascal  dec(shiryo)   や    shiryo := shiryo-1
          BASIC   shiryo = shiryo-1
      shiryoの値を変えないものや、1増やすものも正解である。

      (b) C       shiryo++,   shiryo += 1,     shiryo = shiryo+1    など
          Pascal  inc(shiryo)    や   shiryo := shiryo+1
          BASIC   shiryo = shiryo+1
      shiryoの値を2または3増やすものも正解である。
    


 試料の重さを x グラムとし、その3進表現を tn...t1 t0 とする:

x = tn3n+...+t131+ t030

これを左の皿に乗せて天秤を釣り合わせるためには、 右の皿に 3iグラムの分銅を ti 個 (i=0, 1, ..., n) 乗せればよい。したがって、ti=0 の場合は 何もせず、ti=1 の場合は右の皿に 3i グラムの分銅を 乗せる。しかし、3i グラムの分銅は1個しかないので、 ti=2 の場合には 3i グラムの分銅を右の皿に2個 乗せる代わりに左の皿に 3i グラムの分銅を1個乗せ、 その結果 2×3i+3i=3i+1 となるので ti+1← ti+1+1 とする。 以上のことを i=0, 1, ... と順に行なうと ti=3 となることもあるが、この場合は左右どちらの皿にも 分銅を乗せないまま ti+1← ti+1+1 とすればよい。
 問題文のプログラムでは、fundou が 3i を表わし、 shiryo を3で割った余りがその時点における ti (上述のように、i に従って ti は変化する)を表わしている。 実際、
  ti ← shiryo mod 3;   shiryo ← shiryo}/3;   i ← i+1;
によって ti が下位の桁から順次定まる。 従って、上述したことより、
 ti=1 なら右の皿に 3i グラムの分銅を乗せ、
 ti=2 なら左の皿に 3i グラムの分銅を乗せ、
 それ以外の場合には何もしない。
ただし、ti=2, 3 の場合には ti+1 ← ti+1+1 に対応して shiryo ← shiryo+1 とする。
 こうして第 i ステップが終わった後、
  fundo ← fundo; shiryo ← shiryo/3;
を実行してから第 i+1 ステップに移る。このとき   shiryo ← shiryo/3;
が実行されるので、
ti=(shiryo mod 3)=0 の場合には shiryo ← shiryo+1 あるいは shiryo ← shiryo+2 を行なっても、
ti=1 の場合には shiryo ← shiryo-1 あるいは shiryo ← shiryo+1 を行なっても、
ti=2 の場合には shiryo ← shiryo+2 あるいは shiryo ← shiryo+3 を行なっても、
ti=3 の場合には shiryo ← shiryo+2 を行なっても shiryo の値を変えなくても、
いずれの場合も同じ結果となる。
 以上の考察から、空欄(a),(b)ともに3つの解が可能であることが分かる。