tookunn’s diary

主に競技プログラミング関係

パナソニックプログラミングコンテスト(AtCoder Beginner Contest 195) B - Many Oranges

問題

atcoder.jp

考察

重要な点としては

  • Aグラム以上Bグラム以下というみかんの重さに下限と上限があること。
  • みかんの重さが整数とは限らない。
  • 重さの合計がぴったりW(キログラム単位)であること。

みかんの個数Nが分かっている場合、
 A \le \frac{1000W} N \le B が成り立てば、N個のみかんで重さの合計をぴったりWにできる。

公式解説
 AN \le 1000W \le BN(この考察内だと A \le \frac{1000W} N \le Bを式変形したものと同じ)
を見たとき、なぜこれが成り立つと重さをぴったりWにできるんだ?と思ったが、

 \frac{1000W} Nは1000Wをみかんの個数でN等分したときのみかん1個の重さ。
N個の中で1個の重さを増やすと他の1個以上のみかんの重さが減り、逆に1個の重さを減らすと他の1個以上のみかんの重さが増えます。
(なぜなら、重さの合計は変わらずWで、みかんの重さの配分を変えているだけだから。)

このN個のみかんの重さの配分をいくら変えても、 \frac{1000W} Nを中心に重さの最小値Xと最大値Yの差が広がり
 A \le (X \le \frac{1000W} N \le Y) \le Bの範囲に当てはまらない場合が出てきてしまう。
なので、XとYの差が最も小さくなる \frac{1000W} NがA以上、B以下であるかどうかを判定している。

制約の  1 \le W \le 1000 から
みかんの個数は1~1000000までの範囲だと分かる。
あとはこの範囲の中でみかんの個数で全探索をしながら、 A \le \frac{1000W} N \le Bが成り立つかをチェックして
最大の個数、最小の個数を出力する。