AtCoder Beginner Contest 103
AtCoder Beginner Contest 103 (ABC103) の解説です。
AtCoder Beginner Contest 103 旧版
AtCoder Beginner Contest 103 beta版
解けた問題だけ解説をしていきますー
要項
AtCoder Beginner Contest 103
rated 1200
7/21(土) 21:00 ~ 22:40 (100分)
100-200-300-400 (4問)
ペナルティ: 5分
方針
全完
A - Task Scheduling Problem
まず、順番を並び替えても問題は無いのでとします。
最初にを選ぶものとします。
この時、を次に選ぶとのコストとなり、を次に選ぶとのコストとなることから、必ずを選ぶべきです。
また、最初にを選んだ場合、次にどちらを選んでものコストは掛かり、を最初に選んだ時のコストは絶対値の関係上を最初に選んだ時と等しい話になるので、結局最適に選んだ時のコストはになります。
つまり、答えはです。
ちなみに、この答えはが3個の時だけでなく任意の個数について成り立ちます。
B - String Rotation
まず、文字列とします。
この時、回転を1回行ったの文字列はとして表すことができます。
つまり、回転を回行った文字列はとして表すことができます。
後はこれがと一致するか比較すれば良いです。
C - Modulo Summation
整数とします。
この時、をで割った余りはになります。
同様に、をで割った余りはになり……ということはとなります。
また、これ以上大きな答えはあり得ないのでを出力すれば良いです。
D - Islands War
まず、全ての橋を落としてしまえば自明に条件は達成できるので、少なくとも答えは以下であることが分かります。
また、を満たす番目の橋について、少なくとも1つの橋を落とせば要望は達成できるので、全部落とす必要はないことも分かります。
そこで、なるべくなら同時に複数の要望を達成できるような橋を落としたいですよね?
そこで、まずはについてソートすることにより、となっているものとします。
この時、以上の橋を落とさないと少なくとも番目の要望は達成できないので、この要望を達成するための橋をどこで落とせば良いか考えます。
この時、少なくとも落とす橋は未満であることは自明です。
また、なるべく多くの橋を落としたいことを考えると、番目の橋を落とした方が良いことが分かります。
この時、を満たす全てのについて番目の要望が達成できたので、これを除外します。
後は要望を満たしてないのうち最も大きいものについて再帰的に同じことを繰り返せば答えが求まります。
どの要望が達成できているか否かを保持しておくと、計算量はソートに、大きい方から順に橋を落とすのにで求められるのでで導出できます。
ソートにバケットソートを用いればで解けますね。
結果
oooo 4完(1000点) 2:08-8:31-13:23-27:48 / 27:48
93位
感想
最初のジャッジが壊れていて提出が全てWAになったのは恐怖でしたが、サンプルすらWAなことを見てジャッジミスを確信し先へ進んだので軽微な被害で済んだのは良かったです。
アルゴリズム的な知識をあまり問わず数学的な問題セットなので、ちゃんと図などを書いて考察すると解きやすい問題でしたね。
今回の問題セットが理解できなかった人は、ちゃんと図を書いて考察してみましょう!