34
CODE THANKS FESTIVAL 2014 B日程 解説 AtCoder株式会社 代表取締役 高橋 直大 2015/6/23 1

CODE THANKS FESTIVAL 2014 B日程 解説

Embed Size (px)

Citation preview

Page 1: CODE THANKS FESTIVAL 2014 B日程 解説

CODE THANKS FESTIVAL 2014 B日程解説

AtCoder株式会社代表取締役

高橋直大

2015/6/23 1

Page 2: CODE THANKS FESTIVAL 2014 B日程 解説

©AtCoder Inc. All rights reserved. 2

A問題 朝食

2015/6/23 2

Page 3: CODE THANKS FESTIVAL 2014 B日程 解説

A問題 問題概要

• 朝食の準備をする

– コーヒーを淹れるのに A 分かかる

– トーストを焼くのに B 分かかる

• 同時に準備を始めると、準備が完了するのは何分後?

2015/6/23 3

Page 4: CODE THANKS FESTIVAL 2014 B日程 解説

A問題 解法

• 準備を同時に始めるので、遅い方の準備が終わったときに全体の準備も完了する

• A と B のうち大きい方が答え

2015/6/23 4

Page 5: CODE THANKS FESTIVAL 2014 B日程 解説

©AtCoder Inc. All rights reserved. 5

B問題 電卓ゲーム

2015/6/23 5

Page 6: CODE THANKS FESTIVAL 2014 B日程 解説

B問題 問題概要

• 演算子op(+,*)と1桁の数字A,B,Cがある

• A (演算子1) B (演算子2) C

を最大化するように演算子を割り当てる.

ただし演算子の優先順序はなく左から計算

[例] (A,B,C)=(1,2,3)のとき,「1 → + → 2 → × 3」で答え9となり最大

Page 7: CODE THANKS FESTIVAL 2014 B日程 解説

B問題 解法

• 全通り割り当てを試す(4通り)

• その中の最大値を出力

• 具体的には,Max (

A+B+C,

(A+B)×C,

A+B×C,

A×B×C )

を出力

Page 8: CODE THANKS FESTIVAL 2014 B日程 解説

©AtCoder Inc. All rights reserved. 8

C問題 人気投票ゲーム

2015/6/23 8

Page 9: CODE THANKS FESTIVAL 2014 B日程 解説

C問題 問題概要

• N 個の地域で人気投票が行われた

– i番目の地域の総投票数は Vi

– i番目の地域の「きつね派」の得票数は Fi

• 「きつね派」が過半数の票を獲得した地域数は?

• 注意: ちょうど半分の得票は過半数ではない

2015/6/23 9

Page 10: CODE THANKS FESTIVAL 2014 B日程 解説

C問題 解法

• Vi が全部入力されてから Fi が入力されるので、

Vi を読み込んだら配列に記憶しておきましょう

• 過半数の判定方法の考え方はいろいろ

– 2 倍したら総投票数を超える: 2 × Fi > Vi

– 「うさぎ派」の得票数より多く得票: Fi > Vi - Fi

– Fi > Vi / 2 では切り捨てに注意

2015/6/23 10

Page 11: CODE THANKS FESTIVAL 2014 B日程 解説

©AtCoder Inc. All rights reserved. 11

D問題 足ゲーム

2015/6/23 11

Page 12: CODE THANKS FESTIVAL 2014 B日程 解説

D問題 問題概要

• N個のボタンをT秒間決められたタイミングで踏みたい

• ボタンiはAi秒の間隔で踏まなければならない

• 同時に踏むボタンの数と同じ数の足が必要

• 足は何本必要?

Page 13: CODE THANKS FESTIVAL 2014 B日程 解説

D問題 解法

• T秒分の配列をとって0で埋めておき、Ai,2Ai,3Ai,…の場所に+1していく

• 配列の中の最大の値が答え

• 注意点

• 要素 T までアクセスするので、配列のサイズは T では足りません

Page 14: CODE THANKS FESTIVAL 2014 B日程 解説

©AtCoder Inc. All rights reserved. 14

E問題 マスゲーム

2015/6/23 14

Page 15: CODE THANKS FESTIVAL 2014 B日程 解説

E問題 問題概要

• R×Cの二次元盤面がある

• いくつかの長方形区間を黒く塗りつぶした後,

黒塗りのマスのみを辿ってスタート地点からゴール地点に辿り着けるかどうかを判定する

Page 16: CODE THANKS FESTIVAL 2014 B日程 解説

E問題 解法

• まず愚直に黒塗り操作をシミュレーションする

– (一回の操作でO(RC)かかるがO(NRC)で余裕)

• 次に,盤面上を深さ優先探索なり幅優先探索なりを行い可達判定

• 座標の扱いに注意(どっちがどっちの軸に対応しているか等)

• 境界条件に(長方形区間の塗る範囲)

• 配列外参照に注意(探索時)

Page 17: CODE THANKS FESTIVAL 2014 B日程 解説

©AtCoder Inc. All rights reserved. 17

F問題 太鼓ゲーム

2015/6/23 17

Page 18: CODE THANKS FESTIVAL 2014 B日程 解説

F問題 問題概要

• 画面に文字列 S が表示されていたら太鼓の真ん中を、文字列 T が表示されていたら太鼓のふちを叩くゲームがある

• 画面には S と T がいくつか一列に並んで表示されて

いるが、間隔が狭すぎてどこで区切られているのか分からない

• 画面に表示されている長い文字列 X を S または T に区切る方法は何通り?

Page 19: CODE THANKS FESTIVAL 2014 B日程 解説

F問題 解法

• DP[i] = i文字目までの正しい区切り方の個数

• 例 (X=“dkdkdkdk”, S=“dk”, T=“dkdk”)

d k d k d k d k

1 0 1 0 2 0 3 0 5DP:

Page 20: CODE THANKS FESTIVAL 2014 B日程 解説

F問題 解法

• DPの遷移

• if i文字目からの|S|文字が S と一致していたらDP[i+|S|] += DP[i]

• if i文字目からの|T|文字が T と一致していたらDP[i+|T|] += DP[i]

• modを取るのを忘れないように!

Page 21: CODE THANKS FESTIVAL 2014 B日程 解説

©AtCoder Inc. All rights reserved. 21

G問題 石取りゲーム

2015/6/23 21

Page 22: CODE THANKS FESTIVAL 2014 B日程 解説

G問題 問題概要

• 石取りゲームをする

– 最初は N 個の石がある

– 先手は 1 手目に 1~P 個の石をとれる

– それ以降は直前にとられた石の個数 + 1 個までの石を 1 手でとれる

• 先手必勝?後手必勝?

2015/6/23 22

Page 23: CODE THANKS FESTIVAL 2014 B日程 解説

G問題 解法(1/3)

• (N, P) で「石が N 個で、最初に P 個までとれる」という設定のゲームを表すとする

• (N, P) から先手が k 個の石をとったとき

– 残った石は N - k 個

– 次にプレーヤーがとれる石は k + 1 個まで

• (N – k, k + 1) で先手と後手が入れ替わったようなゲームになった!

2015/6/23 23

Page 24: CODE THANKS FESTIVAL 2014 B日程 解説

G問題 解法(2/3)

• 問題文に書かれている重要事実

– 「N, P の値が決まればどちらかが必勝」

• W(N, P) := 「ゲーム (N, P) で必勝なプレーヤー」として、これを計算することを考える

• 先ほどの考察より、

W(N, P) はW(N-k, k+1) から計算できそう?

2015/6/23 24

Page 25: CODE THANKS FESTIVAL 2014 B日程 解説

G問題 解法(3/3)

• W(N, P) を計算するとき、k (1 ≦ k ≦ P) について

• W(N-k, k+1) = 後手、となるような k があれば

W(N, P) = 先手

– 最初に k 個とれば相手には勝つ術がないということ

– 1 手進めると先手と後手が逆になっていることに注意する

• そのような k がなければW(N, P) = 後手

– どのようにとっても相手に必勝法がある

2 人ゲームの必勝判定を探索するときの典型パターン

2015/6/23 25

Page 26: CODE THANKS FESTIVAL 2014 B日程 解説

©AtCoder Inc. All rights reserved. 26

H問題 模様替え

2015/6/23 26

Page 27: CODE THANKS FESTIVAL 2014 B日程 解説

H問題 問題概要

• 長さ2~20の英単語がNコある

• それらのみを使ってしりとりをする

• 単語を反転して使用することができる

• 一度使った単語は使用不可

• 最初の単語は自由に選べる

• 全部使いきって終了したいが,できない場合があるので,適当に英単語を追加して全部使いきれるようにしたい

• 追加する必要がある英単語の最小値を答えよ

• 1<=N<=100000

• [例]{ab,cb,xx} : 単語”cx”を追加しab→bc(反転)→cx→xx

Page 28: CODE THANKS FESTIVAL 2014 B日程 解説

H問題 考察(1/4)

• アルファベットを頂点とし,単語を辺(単語の先頭と末尾のアルファベットを結ぶ辺)としたグラフを考える

• 単語は反転できるという性質から,無向辺になる

• [例]{ab,cb,xx} cxを追加

a

b

x

c

xx

ab

cb

cx

Page 29: CODE THANKS FESTIVAL 2014 B日程 解説

H問題 考察(2/4)

• これらを適当な頂点から始めて,辺を一筆書きできればOK → 無向オイラー路が存在するかどうか?

• 無向オイラー路:無向グラフですべての辺を一度ずつ使用する経路 さっきの例→

• 無向オイラー路が存在する必要十分条件は,

– グラフが連結かつ

– 次数(頂点から伸びてる辺の数)が奇数の点が2コ

– または全てが偶数の点(閉路)

[例]

a

b

x

c

xx

ab

cb

cx

偶 偶

偶 奇

奇OR

偶 奇

Page 30: CODE THANKS FESTIVAL 2014 B日程 解説

H問題 考察&解法(3/4)

• 英単語長は十分大きいのでどんな辺でも追加できるとみなせる(英単語が枯渇しない)

• まずとにかく,全ての連結成分を連結にさせることを考える(以下,次数が奇数の頂点を奇点・偶数の点を偶点と呼ぶ)

• 奇点を偶点にして損をすることがない(※逆で損をすることはあるかもしれない)

• したがって連結成分の個数が1つになるまで以下のような戦略を繰り返す– 奇点を持つ2つの連結成分がある→適当な奇点同士をつなぐ

– 奇点を持つ連結成分が1つしかない→奇点と,奇点を持たない連結成分の適当な偶点を結び連結に

– 奇点を持たない連結成分しかない→仕方ないので偶点同士を結ぶ

Page 31: CODE THANKS FESTIVAL 2014 B日程 解説

H問題 考察&解法(4/4)

• 最終的に連結グラフになったあと,そのグラフに辺を追加してオイラー路の条件を満たすようにしたい

– 奇点が2個以下になるまで,奇点同士を貪欲に結んでいけばよい

(※)奇点が奇数個あることはありえないことに注意

• 一連の操作で追加した辺の数が答え.

• 次のページに操作例

(※)グラフに1つ辺を追加するとグラフ全体の次数の総和は2増えるはずであり,

総和は必ず偶数.一方,奇数個の奇点が存在すると仮定すると,次数の総和が奇数となり,矛盾する.したがって奇数個の奇点を持つグラフは存在しない.

Page 32: CODE THANKS FESTIVAL 2014 B日程 解説

H問題

• 以下の3つのグラフを連結にする

偶 偶

偶 奇

偶 奇

偶 偶

偶 奇

偶 奇

偶 奇

偶 奇

偶 奇

偶 偶

偶 奇

偶 奇

偶 偶

偶完成!

Page 33: CODE THANKS FESTIVAL 2014 B日程 解説

H問題 計算量

• 辺の入力でO(N)

• 答えを求めるパートについて,構築されるグラフの頂点数は26以下であることから,どんなやり方をしてもすぐ終わるはず

Page 34: CODE THANKS FESTIVAL 2014 B日程 解説

©AtCoder Inc. All rights reserved. 34

おわり!

2015/6/23 34