Más contenido relacionado
La actualidad más candente (20)
Similar a Code Formula 予選B 解説 (13)
Code Formula 予選B 解説
- 7. B問題 アルゴリズム
•一桁ごとに処理していく
–数字で扱うなら、10で割った余り
•BigIntegerなどの多倍長クラスが必要であることに注意
•10で割った余りで必要な数字を取り出す
•10で割ることで、次の数字に移動する
–文字列で扱うなら、後ろから何文字目か
•文字列Sとして、S[S.Length – 1 – k] のような感じ
•数字の0ではなく文字の’0’なので、S[k]-’0’のような処理が必要
•足し算が終われば、それぞれの値を出力するだけ
–偶奇を間違えないように!
2014/8/28
7
- 10. C問題 アルゴリズム
•まずは、3回しかswapしないことに注目!
–あんまり回数が多くないので、探索ができそう?
–1回の文字の選び方は、N*(N-1)/2通り
•NはA,Bの長さ、最大999
•3回繰り返すとO(N^6)となり、これは間に合わない。
–でも、もうちょっと工夫すれば間に合いそう!
2014/8/28
10
- 11. C問題 アルゴリズム
•3回のswapで文字列が同じになる
–つまり、変更する文字は最大6文字
–7文字以上が違っていた場合、明らかに不正解!
•これを利用して、探索範囲を減らそう!
–使っている文字の数が一致しない場合も不正解!
•A,Bで一致している文字は無視して良い?
–“ab”, “ab”のような、ケースで不正解になってしまう。
•3回ちょうどでなければならないため
2014/8/28
11
- 12. C問題 アルゴリズム
•方針1: ちょうどの判定を行うにはどうしたら良い か?
–もし同じ文字がAの中に存在すれば、同じ文字を交換する ことで、時間稼ぎが出来る
–これを活用すると、「一致している文字の中でも、同じ文 字を2つ残しておけば、残りは排除して良い」
•残る文字数は、不一致6 + 一致26*2 = 58
•O(N^6)でも、不一致数などで枝刈をすれば十分間に合う
•方針2: 厳密には、以下のような処理で良い
–一致した文字を全て排除する
–元々の文字列Aに、同一文字が1つでも含まれていた3回 以下の探索、そうでなければ3回の探索を行う
2014/8/28
12
- 14. D問題 問題概要
•N種類の硬貨がある
•K番目の硬貨は10^(k-1)円である
•K番目の硬貨をA_k枚持ってる時、払える金額は何 パターン存在するか.10億7で割った余りを出力せよ
•制約
–1≦N≦50
–0≦A_K≦
2014/8/28
14
- 15. D問題 アルゴリズム
•普通に全列挙するのは間に合わない。
•方針1:動的計画法を使って纏める
–各硬貨ごとに、「今見ている硬貨何枚分余計に払えるか」 を状態とし、それを満たすパターン数を調べる
•例えば26枚の1円があったとすると、10円を調べる時には、
–残り2枚分の自由度があるのが7パターン
»1の位が0,1,2,3,4,5,6の時
–残り1枚分の自由度があるのが3パターン
»1の位が7,8,9の時
•のように、何枚自由度があるパターンが何通りあるか、を動的計 画法で求める
–むずかしい!
•もっと簡単な方法が存在する!
2014/8/28
15
- 16. D問題 アルゴリズム
•方針2:掛け算をしよう!
–入力例3
•{12, 3, 7, 34}という入力
•これを{12, 3} {7} {34}という風に分ける
–{12, 3} では、0円から42円までが表現可能 43通り
–{7}では、0~7 * 100円が表現可能 8通り
–{34}では、0~34 * 1000円が表現可能 35通り
•よって、パターン数は、43*8*35-1=12039通り、と求められる
–このように、幾つかのブロックに分けてあげると、独立に 計算可能!
•では、どのように分ければ良いか?
2014/8/28
16
- 17. D問題 アルゴリズム
•方針2:掛け算をしよう!
–入力例3
•{12, 3, 7, 34}という入力
•これを{12, 3} {7} {34}という風に分ける
–{12, 3} では、0円から42円までが表現可能 43通り
–{7}では、0~7 * 100円が表現可能 8通り
–{34}では、0~34 * 1000円が表現可能 35通り
•よって、パターン数は、43*8*35-1=12039通り、と求められる
–このように、幾つかのブロックに分けてあげると、独立に 計算可能!
•では、どのように分ければ良いか?
2014/8/28
17
- 18. D問題 アルゴリズム
•ブロックの分け方
–今見ている硬貨までの価値の和が、次の硬貨の価値に 達している場合
•具体例
–{13} (13円なので、次の10円よりも大きい)
–{12, 9} (102円なので、次の100円よりも大きい)
–{100, 0, 0} (100円なので、次の100円と等しい)
•などは、0~価値の合計までの金額を、全て表現可能
–次の硬貨の価値に達していない場合
•具体例
–{7}
–{9, 9}
•これは、次の硬貨に影響を与えないので、ブロックを分けてしまう
2014/8/28
18