2/5

PKU 2641

跳ね返るとか考えずにx方向にn*a, y方向にm*b動いたと考える。そしてatan。

PKU 2642

M個選んだ平均がcmin以上cmax以下 ⇔ M個選んだ合計がM*cmin以上M*cmax以下

dp[i][j] := i個選んで合計をjにするとき、最も安いコスト

としてDPする。M*cmaxは最大でも20000なので余裕。

PKU 2643

やるだけ

PKU 2645

赤の個数をr, 黒の個数をbとすると

r(r-1)/(r+b)(r+b-1) = p/q
(r+b)(r+b-1)/r(r-1) = q/p
(r+b)(r+b-1) = qr(r-1)/p

となって、

(r+b)2 > qr(r-1)/p > (r+b-1)2

が分かる。またこれから

r+b = ceil(sqrt(qr(r-1)/p))

が分かる。rを決めつけるとbはO(1)で求まるから、その結果が (r+b)(r+b-1) = qr(r-1)/p と 2 <= r+b <= 50000 を満たすかチェックする。

PKU 2607

Floydして全部試す。

PKU 2608

やるだけ。

PKU 2609

ナイーヴな考え方だと状態数が200*10000*10000で破滅する。

i台目の車について考えてる時、片方のフェリーにjまで車が乗っていればもう片方のフェリーにどこまで車が乗っているかは、i-1台目までの車の合計からjを引くことで一意に定まる。よって状態数を200*10000に減らすことができて、あとはDP。

PKU 2610

やるだけ。

PKU 2611

ad-hoc

できるだけ後ろの方の桁で、自分より大きいやつに変えられるところを探す。んで変えたところより後の部分をできるだけ小さくしたら答。

PKU 2613

logとる手抜き解法でWAったので素直に素因数分解しました。

PKU 2614

使える値の範囲が[floor(0.99a),a]だったとして、 an >= floor(0.99a)(n+1) を満たすような n を求める。これを満たすようなnについて何が言えるかというと、[floor(0.99a),a]からn個とってきて作れる値の範囲と、n+1個とってきて作れる範囲の値がかぶるということ。b = floor(0.99a) とすると

an >= b(n+1)
an >= bn+b
an-bn >= b
(a-b)n >= b
n >= b/(a-b)

となるから、[b, a]からceil(b/(a-b))個以上とってくれば、b*ceil(b/(a-b))以上の数は全て作ることができる。

a = 4500 を代入することで441015以上の数は全て作れることがわかる。この事実から計算時間を削減することができる。

あとはDP。

PKU 2560

MST