AtCoder Beginner Contest 192のきろく
SOMPO HD プログラミングコンテスト2021(AtCoder Beginner Contest 192)に参加しましたが、レートが冷えてしまいました... 悲しいね。
- A - Star (100点)
- B - uNrEaDaBlE sTrInG (200点)
- C - Kaprekar Number (300点)
- D - Base n (400点)
- E - Train (500点)
- F - Potion (600点)
- 結果、感想
A - Star (100点)
より大きい、 の倍数で、 に最も近い数は であり、求める答えは $$100 \left\lfloor \frac{X}{100} + 1 \right\rfloor - X = 100 - \left(X - 100 \left\lfloor \frac{X}{100} \right\rfloor\right) = 100 - (X \bmod 100)$$ となります。
最後の等号は $$ \left( \frac{X}{100} - \left\lfloor \frac{X}{100} \right\rfloor \right) = \left(\frac{X}{100}\text{ の小数部分}\right) $$であることから導かれます。
B - uNrEaDaBlE sTrInG (200点)
問題名自体が読みにくい文字列(unreadable string)になっていますね。
問題文にあるようなことを素直に実装します。大体の言語でインデックスが0オリジン*1であることに注意しましょう。
C - Kaprekar Number (300点)
C++ではstd::to_string(int)
で文字列にし、std::sort(iterator, iterator)
でソート、std::stoi(std::string)
で整数型にする、ということができます。
D - Base n (400点)
素直に探索しようとしてはまってしまいました。
が1文字の時に注意です。得られる値は1種類しかないのでこの時の答えは か です。 のとき で、そうでないとき です。
自分が通した解法
場合分けが多いきれいじゃない解法です...
素直に について から値を全探索しようとしました。 進数の時の の値を求めて より大きくなったら終わります。
が3文字以下の時は の値や1文字目によってはこの方針では間に合わないです。
が2文字の時は (文字列として)とすると、 となる の範囲を求めますが、一次式なので ぐらいまでの可能性があります。この不等式を解いて となるので、答えは です。
が3文字の時は (文字列として)とすると、 となる の範囲を求めますが、二次式なので ぐらいまでの可能性があります。この不等式は として、 となります。勿論、判別式が非正のときは解がなく*2、答えは です。そうでないとき答えは となりますが、平方根が出てきて、誤差が怖いのでこの附近をすこし探索します。
解説の解法
進数での の値は単調増加であるので、二分探索によって の範囲を求めることができます。オーバーフローにしないようにすれば、初期上限は にすることができます。
オーバーフローしないようにするには
bool ng = false; long long v = 0; for(int i(0), i_len(X.size()); i < i_len; ++i){ if(M / n < v){ ng = true; break; } v *= mid; if(v + X[i] - '0' > M){ ng = true; break; } v += X[i] - '0'; }
のようにすればいいです。他にも を 進数に直すのも手です*3。
E - Train (500点)
Dijkstra法を改造します。各辺に行き先 と所要時間 だけでなく、 の情報を持たせ、Dijkstra法の更新の所がもともと のところを、 とすると今回の問題が求まります。
F - Potion (600点)
DPであるとは思いましたが、各 のときの最大値を記憶する必要があるのですが、なぜかこの時に だけ必要だと思い込んでしまい、 で無理だなってなってしまい、コンテスト中には通せませんでした。実際は各 のときのを記憶すればいいので、そこに関してはそれぞれ計算させてやればいいので、普通に間に合います。
合成する素材数を 個と決めたときの のうち 個を選んだ時の和で が と等しいものの最大値を とした時、 の最小値が答えとなります。
ここで
のとき としてとなります。 を大きい方から更新していくと実は の部分は使いまわせ、次元を1つ減らすことができます。計算量は で なので若干危うく見えますが、 であることから より定数倍が ほどなので余裕があることが分かります。
結果、感想
D問題で5ペナ喰らった事と、F問題が描けなかったのが悔しいです。ちゃんと精進しないと...