Space Elevator (UVa Live Archive Asia - 2008 Taipei(Taiwan))

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=322&page=show_problem&problem=2267

問題

右方向にr個、左方向にq個止まる候補の箇所がある。各箇所はxiの場所にあり時間t1nそこに行くとmax(0, pi-t)の利益を1度だけ得る。利益の最大値を求めよ。

解法

dp[lr][left][right][t]でDPする。lrは左端、右端のどちらにいるか、leftは左側をどこまで行ったか、rightは右端、tは現在の時間を表す。これでDPするとメモリが足りないのでleftを使い回せば解ける。

Friend Numbers (UVa Live Archive Latin America - Mexico and Central America 2007)

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=293&page=show_problem&problem=2013

問題

Nに含まれる桁の数値を全て含む数値をFriend Numbersと呼ぶ。範囲[A,B]の中でK番目のFriend Numbersを求めよ。
1

解法

dp[上界が存在する][下界が存在する][使った数値][何桁目]を状態にしたO(2*2*2^10*100*10)のdp。Aの桁数がBの桁数よりも小さい場合はleading 0にする。Nに0が含まれるとか、leading 0の際に0を使ったとみなさない事とかに注意。

The Game (UVa Live Archive Europe Southwestern 2008)

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2301

問題

シンプルなゲームをするので自分が何点差で勝つか求めよ。
1<=mugの数<5
石の数の合計<=15

解法

αβ法でやるだけ。
注意点とか細かいルールは以下のとおり。

  • swapのターゲットは最後に石を入れたmugのみ
  • 4ターン分のswapのカウンタはそのmugについて発生し自分と相手で共通
  • swapをやるやらないは選択できるが、add turnとbowlへの石の投入は強制的に発生する
  • swapとbowlへの石の投入で使うmugの対応が違う
  • (bowlへの石の投入の条件である)「before distribution」とはmugから石を取り出す前のこと
  • add turnや相手がいきなりパスした場合はswapのカウンタは減らない
  • 相手が先手

First Knight (UVa Live Archive Europe Southwestern 2008)

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2298

問題

m*nのグリッドがある。各マスで上下左右に移動する確率を与えるので、(1,1)から(m,n)まで行くのに掛かる時間の期待値を求めよ。
2<=m,n<=40
答えは1000000以下

解法

ガウスの消去法で連立方程式を計算する。これだとO(m^3n^3)だが、行列が帯行列であるということを使うとO(mn^3)で計算可能。

Wizards (UVa Live Archive Europe Southwestern 2008)

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2306

問題

n次多項式を与えるのでそれが重解を持つかどうか判定せよ。
0<=n<=10

  • 30<=係数<=30

解法

重解を持つ条件はf(x)=0かつf'(x)=0となるxが存在することである。なので、gcd(f(x),f'(x))の次数が2以上になるかどうかを調べれば良い。計算をdoubleでやったら誤差死したっぽいので、mod 1e+9+7で計算した。

The Merchant Guild (UVa Live Archive Europe Southwestern 2008)

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2302

問題

長さnのハッシュにn個の値を線形探索で値を入れていく。もしもN-1まで開いてない場合は失敗となる。m個分はどのタイミングでどの箇所に挿入するか分かっている。全ての値を挿入できる、値の挿入の仕方は何通りか?
1<=m<=n<=300

解法

m個分の挿入タイミングは関係ないので、どこに挿入するかだけカウントしておく。次にcalc(depth, rest)を後ろから計算していく。depthは現在の位置で、restは現在までに何個の空きがあったかを表していて、前もって挿入された分はそこに来たタイミングでrestから引いておく。途中でrestが負になったら失敗とみなす。コンビネーションの計算を前処理しておけば、このcalcはメモ化再帰でO(n^3)で計算可能。

Top Secret (UVa Live Archive Europe Southwestern 2008)

http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2304

問題

円環の中に長さNの数列がある。この数列の各数値に対して自分自身と左側のL倍と右側のR倍を足した数値を新しい数値にするという操作をS回繰り返す。下X桁だけ取り出した最終的な数列を答えよ。
2<=N<=1,000
0<=S<=2^30
0

解法

行列を作ってS乗する。この時、行列は巡回行列になっているので、掛け算をする時に1行目だけ求めて、残りは1行目をずらした物を入れるとO(N^2logS)で計算できる。