Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ARC 050 B 花束

poyo
August 10, 2016
550

ARC 050 B 花束

問題はhttp://arc050.contest.atcoder.jp/tasks/arc050_b

ソースコードはhttp://poyopoyoyon.hatenablog.com/entry/2016/08/11/022443

公式解説はhttp://arc050.contest.atcoder.jp/data/arc/050/review.pdf

追記
8ページ目の「最初の箱のいずれにも青い花が1本入っています」→「最初の箱のいずれにも赤い花・青い花が1本ずつ入っています」
最初の箱は全部でk個しかないのにもかかわらず、(4)式の値がkより大きくなるのかという疑問ですがそれはありえます。具体的には1つの箱の中で2つ以上の花束が作れる場合です。R=4k, B=2kだけあれば最初のk個の箱と同じものが4セットできることになり、x=2のときには赤い花束が2k個作れます。

poyo

August 10, 2016
Tweet

Transcript

  1. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ARC 050 B 花束 2016 8/11
  2. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 問題概要 http://arc050.contest.atcoder.jp/tasks/arc050_b (以下は、ほとんど問題⽂と同じことを書いてます。 ) ▶ ⾚い花が R 本、⻘い花が B 本あって、花束を作るには次 の 2 種類の⽅法があります。 ▶ ⾚い花を x 本、⻘い花を 1 本取って花束にする。 ▶ ⾚い花を 1 本、⻘い花を y 本取って花束にする。 ▶ このとき最⼤でいくつの花束ができるかを求めます。ただ し、使わない花があってもよいです。 ▶ 1 ≤ R, B ≤ 1018 ▶ 2 ≤ x, y ≤ 109
  3. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 解く前に 1018 ← ヤバそう
  4. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 公式の解説 http://arc050.contest.atcoder.jp/data/arc/050/review.pdf 「k 個の花束を作ることができるか」という問題には Yes か No で答え られるので、⼆分探索で最⼤の k を求めるというものです。1018 も 恐くありません。 では、どのようにして Yes か No かを判定するのでしょうか。 次の式が成り⽴つと Yes だそうです。そうでなければ No です。 ⌊ R − k x − 1 ⌋ + ⌊ L − k y − 1 ⌋ ≥ k (1)
  5. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 説明 まず、k 個の花束を作るためには⾚い花も⻘い花も最低 k 本ず つは必要になります。 これは、花束を作るルールが 2 種類ありましたが、どちらの作 り⽅にせよ 1 つの花束を作るのに、⾚⻘それぞれ 1 つ以上の花 が必要になるからです。 なので、⾚い花 R 本、⻘い花 B 本のうちからそれぞれ k 本取 って、ペアにして箱に⼊れます(というふうに考えるといいか もしれません) 。
  6. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 説明 説明のために、前のページの k 個の箱たち(それぞれ)のこと を「最初の箱」と呼びましょう。 最初の箱にはすべて⾚⻘の花が 1 本ずつ⼊っていますが、この 状態で花束になっている箱の個数は 0 です。 なぜなら、x, y ≥ 2 という条件があったからです。ともに 1 本 ずつしか花がないということは、どうやっても花束の条件を満 たすことはできません。
  7. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 説明 さて、もともと⾚い花は R 本ありましたが、そのうち k 本を取 り出したので残りは R − k 本です。同様に⻘い花の残りは B − k 本です。 これらを(適切に? )最初の箱に割り振れば花束が作れます。 たとえば x = 2 とすると、つまり、⾚い花 2 本と⻘い花 1 本で 花束が作れるとすると、箱の中に⾚い花を 1 本追加すればその 箱は花束になりますね( ? ? ? ) 。 説明のために、⾚い花を x 本、⻘い花を 1 本取ってできる花束 を「⾚い花束」 、⾚い花を 1 本、⻘い花を y 本取ってできる花 束を「⻘い花束」と呼ぶことにします。
  8. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 説明 ⾚い花束を作るには⾚い花が x 本と⻘い花が 1 本必要です。し かし、幸運なことに最初の箱のいずれにも⻘い花が 1 本⼊って います。このことから、⾚い花束を作るためには最初の箱に⾚ い花を x − 1 本追加すると、その箱は⾚い花束になります。 では、残った R − k 本の⾚い花を使っていくつの⾚い花束を作 ることができるのでしょう。
  9. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 説明 ここで、最初の箱とは異なる箱に R − k 本の⾚い花を x − 1 本 ずつ⼊れていくことを考えます。x − 1 本に満たない場合は、 箱としてみなしません。 これらの箱の中⾝をそれぞれ最初の箱に追加すれば、 (前のペ ージで分かったことにより)その箱は⾚い花束になります。そ して、⾚い花束の個数は?個になります。
  10. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 説明 R − k 本ある⾚い花を x − 1 本ずつに分けるのですから、図中 の?を表す式は次の式になるでしょう。 ⌊ R − k x − 1 ⌋ (2) ただし、⌊この記号⌋ は⼩数点以下切り捨てのような意味です。 x − 1 本に満たず箱となれなかった余りの⾚い花は無視すると いうことを表しています。 以上の議論は⻘い花、⻘い花束についても同様に適⽤できるの で、作ることができる⻘い花束の個数は ⌊ B − k y − 1 ⌋ (3)
  11. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 説明 全体の作ることができる花束の個数は、⾚い花束の個数+⻘い 花束の個数なので ⌊ R − k x − 1 ⌋ + ⌊ L − k y − 1 ⌋ (4) と表せます。 「k 個の花束を作ることができるか」という問い には、(4) 式の値と k との⼤⼩を⽐較することで答えることが できます。(4) 式の値が最低 k であれば Yes ですね。もちろん、 k より多いぶんには構いません。過剰分の花束については、バ ラして花に戻して使わなかったことにすればよいですから。こ のことを式で表すと式 (1) が導かれます。 ⌊ R − k x − 1 ⌋ + ⌊ L − k y − 1 ⌋ ≥ k (1)
  12. . . . . . . . . . .

    . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . おわりに ソースコードはhttp://poyopoyoyon.hatenablog.com/entry/ 2016/08/11/022443に掲載しています。R − k などが負になる ときがあるのでコードにするときは注意する必要があると思い ます。