Diese Präsentation wurde erfolgreich gemeldet.
Wir verwenden Ihre LinkedIn Profilangaben und Informationen zu Ihren Aktivitäten, um Anzeigen zu personalisieren und Ihnen relevantere Inhalte anzuzeigen. Sie können Ihre Anzeigeneinstellungen jederzeit ändern.

Code Formula 予選B 解説

Code Formula 予選B 解説

Ähnliche Bücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen

Ähnliche Hörbücher

Kostenlos mit einer 30-tägigen Testversion von Scribd

Alle anzeigen
  • Als Erste(r) kommentieren

Code Formula 予選B 解説

  1. 1. Code Formula 2014 予選B 解説 AtCoder株式会社 代表取締役 高橋 直大 2014/8/28 1
  2. 2. ©AtCoder Inc. All rights reserved. 2 A問題 サイコロ 1.問題概要 2.アルゴリズム 2014/8/28
  3. 3. A問題 問題概要 •サイコロの表面を表す整数Nが与えられる •サイコロの底面に書かれた数字を出力しなさい。 •制約 •1 ≦ N ≦ 7 2014/8/28 3
  4. 4. A問題 アルゴリズム •方針 –7 – Nを求める •対面の合計が7なので、この計算で求まる。 2014/8/28 4
  5. 5. ©AtCoder Inc. All rights reserved. 5 B問題 11の倍数 1.問題概要 2.アルゴリズム 2014/8/28
  6. 6. B問題 問題概要 •11の倍数を求める時には、下から数えて偶数桁目 の数字の和と、奇数桁目の数字の和を比較する •これら2つの和を求めよ •制約 –1≦N≦101000−1 2014/8/28 6
  7. 7. B問題 アルゴリズム •一桁ごとに処理していく –数字で扱うなら、10で割った余り •BigIntegerなどの多倍長クラスが必要であることに注意 •10で割った余りで必要な数字を取り出す •10で割ることで、次の数字に移動する –文字列で扱うなら、後ろから何文字目か •文字列Sとして、S[S.Length – 1 – k] のような感じ •数字の0ではなく文字の’0’なので、S[k]-’0’のような処理が必要 •足し算が終われば、それぞれの値を出力するだけ –偶奇を間違えないように! 2014/8/28 7
  8. 8. ©AtCoder Inc. All rights reserved. 8 C問題 仲良し文字列 1.問題概要 2.アルゴリズム 2014/8/28
  9. 9. C問題 問題概要 •長さが同じ文字列A,Bが与えられる。 •Aの文字をちょうど3回swapしてBに出来る場合、A,B を仲良し文字列と呼ぶ •A,Bが仲良し文字列であるかどうかを判定しなさい •制約 •2 ≦|A|=|B|≦1000 2014/8/28 9
  10. 10. C問題 アルゴリズム •まずは、3回しかswapしないことに注目! –あんまり回数が多くないので、探索ができそう? –1回の文字の選び方は、N*(N-1)/2通り •NはA,Bの長さ、最大999 •3回繰り返すとO(N^6)となり、これは間に合わない。 –でも、もうちょっと工夫すれば間に合いそう! 2014/8/28 10
  11. 11. C問題 アルゴリズム •3回のswapで文字列が同じになる –つまり、変更する文字は最大6文字 –7文字以上が違っていた場合、明らかに不正解! •これを利用して、探索範囲を減らそう! –使っている文字の数が一致しない場合も不正解! •A,Bで一致している文字は無視して良い? –“ab”, “ab”のような、ケースで不正解になってしまう。 •3回ちょうどでなければならないため 2014/8/28 11
  12. 12. C問題 アルゴリズム •方針1: ちょうどの判定を行うにはどうしたら良い か? –もし同じ文字がAの中に存在すれば、同じ文字を交換する ことで、時間稼ぎが出来る –これを活用すると、「一致している文字の中でも、同じ文 字を2つ残しておけば、残りは排除して良い」 •残る文字数は、不一致6 + 一致26*2 = 58 •O(N^6)でも、不一致数などで枝刈をすれば十分間に合う •方針2: 厳密には、以下のような処理で良い –一致した文字を全て排除する –元々の文字列Aに、同一文字が1つでも含まれていた3回 以下の探索、そうでなければ3回の探索を行う 2014/8/28 12
  13. 13. ©AtCoder Inc. All rights reserved. 13 D問題 お釣りの嫌いな高橋君 1.問題概要 2.アルゴリズム 2014/8/28
  14. 14. D問題 問題概要 •N種類の硬貨がある •K番目の硬貨は10^(k-1)円である •K番目の硬貨をA_k枚持ってる時、払える金額は何 パターン存在するか.10億7で割った余りを出力せよ •制約 –1≦N≦50 –0≦A_K≦ 2014/8/28 14
  15. 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. 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. 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. 18. D問題 アルゴリズム •ブロックの分け方 –今見ている硬貨までの価値の和が、次の硬貨の価値に 達している場合 •具体例 –{13} (13円なので、次の10円よりも大きい) –{12, 9} (102円なので、次の100円よりも大きい) –{100, 0, 0} (100円なので、次の100円と等しい) •などは、0~価値の合計までの金額を、全て表現可能 –次の硬貨の価値に達していない場合 •具体例 –{7} –{9, 9} •これは、次の硬貨に影響を与えないので、ブロックを分けてしまう 2014/8/28 18
  19. 19. D問題 アルゴリズム •ブロックの分けた後 –それぞれのブロックについて、掛け算して組み合わせを 計算 –それぞれの組み合わせを掛け合わせると、全ての組み合 わせとなる。 2014/8/28 19
  20. 20. D問題 アルゴリズム •注意点 –0は含まないので、どの解法でも最後に1を引くのを忘れ ずに! 2014/8/28 20

    Als Erste(r) kommentieren

    Loggen Sie sich ein, um Kommentare anzuzeigen.

  • akahana1

    Aug. 28, 2014

Code Formula 予選B 解説

Aufrufe

Aufrufe insgesamt

2.084

Auf Slideshare

0

Aus Einbettungen

0

Anzahl der Einbettungen

170

Befehle

Downloads

7

Geteilt

0

Kommentare

0

Likes

1

×