27. B - プログラム
今回も擬似コードにしてみると、こんな感じ:
# N
# A
?
X ← sort(A) # A
for i = 0 to N - 1 #
if X[i] != X[0] #
answer ← X[i] #
break #
は料理の種類数
は値段の配列
を降順にソートする
先頭から順に見ていく
1 番高い料理でないなら
それを答えにして
ループを抜け出す
37. C - まだ使える文字を小さい順に
T を先頭から 1 文字ずつ決めていくが、?
その途中で「まだ使える文字」とは何か?
S = “program” で?
T = “aro” と最初の 3 文字だけ決まっているとき
38. C - まだ使える文字を小さい順に
T を先頭から 1 文字ずつ決めていくが、?
その途中で「まだ使える文字」とは何か?
S = “program” で?
T = “aro” と最初の 3 文字だけ決まっているとき
p, g, m は T にまだ入ってないので使える
39. C - まだ使える文字を小さい順に
T を先頭から 1 文字ずつ決めていくが、?
その途中で「まだ使える文字」とは何か?
S = “program” で?
T = “aro” と最初の 3 文字だけ決まっているとき
p, g, m は T にまだ入ってないので使える
a, o は T に入っているのでもう使えない
40. C - まだ使える文字を小さい順に
T を先頭から 1 文字ずつ決めていくが、?
その途中で「まだ使える文字」とは何か?
S = “program” で?
T = “aro” と最初の 3 文字だけ決まっているとき
p, g, m は T にまだ入ってないので使える
a, o は T に入っているのでもう使えない
r は S に 2 回出てきており、?
T には 1 回しか出てきていないのでまだ使える
41. C - まだ使える文字を小さい順に
T を先頭から 1 文字ずつ決めていくが、?
その途中で「まだ使える文字」とは何か?
S = “program” で?
T = “aro” と最初の 3 文字だけ決まっているとき
p, g, m は T にまだ入ってないので使える
a, o は T に入っているのでもう使えない
r は S に 2 回出てきており、?
T には 1 回しか出てきていないのでまだ使える
4 文字目の候補は p, g, m, r の 4 通り!
42. C - T + c にして大丈夫?
つまり、T の次の文字を c にしてしまった結果、?
このあとどう頑張っても動いた文字の個数が K を?
超えてしまう……、ということにならないだろうか?
43. C - T + c にして大丈夫?
つまり、T の次の文字を c にしてしまった結果、?
このあとどう頑張っても動いた文字の個数が K を?
超えてしまう……、ということにならないだろうか?
↓
残りの部分でできるだけ頑張って、?
動いた文字が少なくなるようにしてみる!?
その結果動いた文字の個数が K 以下にできれば OK
44. C - T + c にして大丈夫?
S = “program”、K = 3 で、?
T = “aro” と最初の 3 文字だけ決まっているとき?
T = “arog” にしても大丈夫か?
45. C - T + c にして大丈夫?
S = “program”、K = 3 で、?
T = “aro” と最初の 3 文字だけ決まっているとき?
T = “arog” にしても大丈夫か?
S p r o g r a m
T a r o g * * *
すでに決まっている部分
(不一致 1 文字)
ここを不一致数が?
少なくなるように?
決めたい
46. C - T + c にして大丈夫?
S = “program”、K = 3 で、?
T = “aro” と最初の 3 文字だけ決まっているとき?
T = “arog” にしても大丈夫か?
S p r o g r a m
T a r o g * * *
すでに決まっている部分
(不一致 1 文字)
ここを不一致数が?
少なくなるように?
決めたい
ここに?
使えるのは?
m, p, r
47. C - T + c にして大丈夫?
S = “program”、K = 3 で、?
T = “aro” と最初の 3 文字だけ決まっているとき?
T = “arog” にしても大丈夫か?
S p r o g r a m
T a r o g * * *
すでに決まっている部分
(不一致 1 文字)
ここを不一致数が?
少なくなるように?
決めたい
m, p, r をうまく?
並び替えて?
“ram” との?
不一致数を?
最小にすればよい!
48. C - 結局のところ
問題?
?同じ長さの文字列 s, t が与えられる。?
?t を並び替えて、s との不一致の数をどれだけ?
?少なくできるか?
これが解ければいい。?
前ページまでの例だと s = “ram”, t = “mpr”
49. C - 具体例で
s = “pipeline”, t = “eppstein” の場合を考える
s p i p e l i n e
t’
t e p p s t e i n
t’ は並び替え後の t を表すとする
52. C - 実は
今の直感的な方法が最適になる
?t の文字を順に見ていき、?
??s に同じ文字がありそこが空いてれば持っていく?
??なければ後回し?
?残った t の文字を適当な空いた場所に持っていく
で OK
53. C - なぜか?
s に ‘a’ が n 個、t に ‘a’ が m 個あるとする。
このとき、min(n, m) 個の ‘a’ は?
並び替えによって一致させられるが、?
残りの ‘a’ はどうやっても不一致になる。
さっきの直感的な方法では、?
min(n, m) 個ぴったり一致させることができる!
54. C - ということは
この問題には意外と?
簡単に答えられる
→ min(s にある a の数, t にある a の数)?
?+ min(s にある b の数, t にある b の数)?
?+ …?
?+ min(s にある z の数, t にある z の数)
が答え!
同じ長さの文字列 s, t が与えられる。?
t を並び替えて、s との不一致の数をどれだけ?
少なくできるか?
92. D - 行列積?累乗に必要なこと
以下の性質を満たしていれば行列積ができる!
a + (b + c) = (a + b) + c
a + 0 = 0 + a = a
a + b = b + a
a ? (b ? c) = (a ? b) ? c
a ? 1 = 1 ? a = 1
a ? (b + c) = (a ? b) + (a ? c)
(a + b) ? c = (a ? c) + (b ? c)
a ? 0 = 0 ? a = 0
93. D - 行列積?累乗に必要なこと
以下の性質を満たしていれば行列積ができる!
a + (b + c) = (a + b) + c
a + 0 = 0 + a = a
a + b = b + a
a ? (b ? c) = (a ? b) ? c
a ? 1 = 1 ? a = 1
a ? (b + c) = (a ? b) + (a ? c)
(a + b) ? c = (a ? c) + (b ? c)
a ? 0 = 0 ? a = 0
足し算は好きな順に?
計算してもいい
94. D - 行列積?累乗に必要なこと
以下の性質を満たしていれば行列積ができる!
a + (b + c) = (a + b) + c
a + 0 = 0 + a = a
a + b = b + a
a ? (b ? c) = (a ? b) ? c
a ? 1 = 1 ? a = 1
a ? (b + c) = (a ? b) + (a ? c)
(a + b) ? c = (a ? c) + (b ? c)
a ? 0 = 0 ? a = 0
足し算しても変わらない
ような値(0)が存在する
95. D - 行列積?累乗に必要なこと
以下の性質を満たしていれば行列積ができる!
a + (b + c) = (a + b) + c
a + 0 = 0 + a = a
a + b = b + a
a ? (b ? c) = (a ? b) ? c
a ? 1 = 1 ? a = 1
a ? (b + c) = (a ? b) + (a ? c)
(a + b) ? c = (a ? c) + (b ? c)
a ? 0 = 0 ? a = 0
足し算は左右を?
入れ替えても結果が同じ
96. D - 行列積?累乗に必要なこと
以下の性質を満たしていれば行列積ができる!
a + (b + c) = (a + b) + c
a + 0 = 0 + a = a
a + b = b + a
a ? (b ? c) = (a ? b) ? c
a ? 1 = 1 ? a = 1
a ? (b + c) = (a ? b) + (a ? c)
(a + b) ? c = (a ? c) + (b ? c)
a ? 0 = 0 ? a = 0
掛け算は好きな順に?
計算してもいい
97. D - 行列積?累乗に必要なこと
以下の性質を満たしていれば行列積ができる!
a + (b + c) = (a + b) + c
a + 0 = 0 + a = a
a + b = b + a
a ? (b ? c) = (a ? b) ? c
a ? 1 = 1 ? a = 1
a ? (b + c) = (a ? b) + (a ? c)
(a + b) ? c = (a ? c) + (b ? c)
a ? 0 = 0 ? a = 0
掛け算しても変わらない?
ような値(1)がある
98. D - 行列積?累乗に必要なこと
以下の性質を満たしていれば行列積ができる!
a + (b + c) = (a + b) + c
a + 0 = 0 + a = a
a + b = b + a
a ? (b ? c) = (a ? b) ? c
a ? 1 = 1 ? a = 1
a ? (b + c) = (a ? b) + (a ? c)
(a + b) ? c = (a ? c) + (b ? c)
a ? 0 = 0 ? a = 0
足し算と掛け算の間に?
分配法則がなりたつ
99. D - 行列積?累乗に必要なこと
以下の性質を満たしていれば行列積ができる!
a + (b + c) = (a + b) + c
a + 0 = 0 + a = a
a + b = b + a
a ? (b ? c) = (a ? b) ? c
a ? 1 = 1 ? a = 1
a ? (b + c) = (a ? b) + (a ? c)
(a + b) ? c = (a ? c) + (b ? c)
a ? 0 = 0 ? a = 0
足し算しても変わらない?
ような値(0)と掛け算すると?
0になる
100. D - 半環
いま挙げた性質を満たすものを半環といいます。
足し算を XOR、掛け算を AND だと思っても?
いま挙げた性質が全部成り立つことが確かめられる!?
→行列の累乗で漸化式の計算ができる!!
実際に性質を満たすことを確かめるのは省略しますが、余裕があればトライして
みてください。?
また、今回のように非負整数に対して「足し算を XOR」「掛け算を AND」とす
れば性質を満たすことを「非負整数は XOR と AND に関して半環をなす」と
言ったりします。
101. D - 解き方に戻りまして
XOR, AND からなる漸化式でも行列累乗が?
使えることが無事に確認できた!
あとは、今回の漸化式を進めるような行列を?
実際に作って累乗すればいい!
103. D - 行列のイメージ
1 行目は、掛け算したときに漸化式が出てくるように
0
B
B
B
B
B
@
AN+K 1
AN+K 2
AN+K 3
...
AN
1
C
C
C
C
C
A
0
B
B
B
B
B
@
C1 C2 · · · CK 1 CK
1 0 · · · 0 0
0 1 · · · 0 0
...
...
...
...
...
0 0 · · · 1 0
1
C
C
C
C
C
A
?
→ 掛け算の結果、漸化式が出てくる?
→ 結果の 1 個目が AN+K になる
104. D - 行列のイメージ
2 行目以降は、項をずらしていくイメージ
0
B
B
B
B
B
@
AN+K 1
AN+K 2
AN+K 3
...
AN
1
C
C
C
C
C
A
0
B
B
B
B
B
@
C1 C2 · · · CK 1 CK
1 0 · · · 0 0
0 1 · · · 0 0
...
...
...
...
...
0 0 · · · 1 0
1
C
C
C
C
C
A
?
たとえば、2 行目に注目すると?
掛け算の結果 2 個目には AN+K-1 が出てくる