2/7

PKU 2465

dp[i][j] := i番目のガソリンスタンドに居て、残り燃料jの時の最小の支払額

としてDP。

PKU 2466

まず求めたい数列を a、入力の数列を s とする。ただし両方ソート済み。

そうするとまず

s[0] = a[0]+a[1]
s[1] = a[0]+a[2]

は明らか。ここで、あるiについてs[i] = a[x] + a[y]となるx, yが分かっている場合に u[i] = true、分かってなければ u[i] = false とする配列 u を用意する。するとまず u[0] = u[1] = true。

s[0], s[1]について二つの式が成り立ったが、これには未知数が3つ(a[0], a[1], a[2])含まれていて解くことができない。s[i] = a[1]+a[2] なる i が判明すれば解くことが出来る。

そこで、2 <= i < N*(N-1)/2 なる全ての i について、 s[i] = a[1]+a[2] と仮定して推論を進めてみる。最後までうまく値が求まったらそれが答となる。

s[i] = a[1]+a[2] と仮定したから、まず a[0], a[1], a[2] の値は簡単に求まる。また、仮定より u[i] = true とする。

そうすると、 u[x] = false となる最小のxについて、 s[x] = a[0]+a[3] であることが簡単に分かる。なので a[3] = s[x]-a[0] として求めることができる。それで u[x] = true と変更して、次に a[3] + a[t] (0 < t < 3) の値を s 内から探して、全部見つかればOK。もし見つからない値があればs[i] = a[1]+a[2] とした仮定が間違っていたことになる。

s[k] = a[3]+a[t] となる値を発見すれば u[k] = true と更新する。そうすれば次は u[x] = false となる最小のxについて、 s[x] = a[0]+a[4] であることが分かる。後は同じプロセスを繰り返せばよい。

PKU 2467

All roads are perfectly straight, with one lane in each direction.

問題文が読めれば解ける。

PKU 2469

やるだけ。

PKU 2363

全探索

PKU 2361

色々チェックする方法でもいいけど、どうせ状態数39 < 20000しかないのでDFSで盤面全列挙。

PKU 3639

米ドル[i] = max(米ドル[i-1], カナダドル[i-1]*レート*0.97)
カナダドル[i] = max(カナダドル[i-1], 米ドル[i-1]/レート*0.97)

PKU 3640

はっしゅ

PKU 3643

局所探索的な何か

PKU 2328

やるだけ。

PKU 2304

やるだけ。

PKU 2303

入力の人形を doll として、それを大きさ順にソート。

memo[a][b][k] := Borisの一番外側の人形がdoll[a]で、Natashaの一番外側の人形がdoll[b]で、Borisの人形がk個のとき、Validな分配ができるかどうか

でメモ化再帰

PKU 2857

再帰

PKU 2858

単語をsetで持ってたら時間間に合わないのでTrieでも作ろうかと思ったけどstringstreamじゃなくてstringを使うようにしたら間に合いました。

PKU 3282

右から左へ行く回数と左から右へ行く回数を別々に数えて、大きい方の2倍が答。ただし左から右へ行く回数の方が多かった場合はその答から1を引く。

PKU 3286

ある数n以下の数の中で、10kの位が0なものは何個あるかを計算することを考える。

まず、nの10kの位が0でない時は 10k*floor(n/10k+1) 個である。

次にnの10kの位が0の時は 10k*floor(n/10k+1-1)+n%10k 個である。

あとは引き算。