キャディプログラミングコンテスト2021(AtCoder Beginner Contest 193)

F はすぐ解けたんだけど,E で詰まりに詰まった...

A - Discount

 \dfrac{100(A-B)}{A} が答え.

B - Play Snuke

 \displaystyle \min _ {\overset{\scriptstyle 1\leq i\leq N,}{A_i\lt X_i}}P _ i が答え.

1 行で書いてみた (Python).

print(min(p for _, p, _ in L) if (L := [*filter(lambda t: t[0] < t[2], ([*map(int, input().split())] for _ in range(int(input()))))]) else -1)

C - Unexpressed

 b\geq 2 より, a ^ b\leq N を満たす  a は高々  \lfloor\sqrt{N}\rfloor である.また, a\geq 2 を固定すると, a ^ b\leq N を満たす  b は高々  \lfloor\log _ a N\rfloor である.

従って, a\geq 2,  b\geq 2,  a ^ b\leq N を満たす  a,  b の全探索は  O(\sqrt{N}\log N) 時間で可能である.

注意しないといけないのは  2 ^ 4 = 4 ^ 2 のような重複を除く必要があるという点で,これは既に現れた値を集合型で管理すれば可能である.

D - Poker

スコア計算式はハリボテで,その実は # の中身を全通り試して確率を計算する問題.実装が面倒.

既に確認されている  8 枚のカードを除いた  9K-8 枚からランダムに残りの  2 枚を引くと考える. 9K-8 枚のカードのうち, i が書かれたカードの枚数を  X_i とすると,高橋君が  i,青木君が  j を引く確率  p_{i, j} は次のように表される.


p_{i,j} = \begin{cases}
\dfrac{X_i\cdot X_j}{(9K-8)(9K-9)} & \text{(if $i\neq j$)}\\
\dfrac{X_i\cdot (X_i-1)}{(9K-8)(9K-9)}  & \text{(if $i = j$)}
\end{cases}

引いた  i,  j を加味したスコアを計算し,高橋君の方が高ければ  p_ {i, j} を答えに加算すればよい.

E - Oversleeping

時刻  t\geq 0 に高橋君が降車に成功することと,次の 2 つが成り立つことは同値である.


X\leq (t\bmod 2X+2Y) \lt X+Y,

P\leq (t\bmod P+Q)\lt P+Q.

制約をよく見るとそれぞれの区間長が小さいので,全探索ができる.つまり, A=(t\bmod 2X+2Y),  B=(t\bmod P+Q) と決め打って以下のような連立合同式へと変換する.


\begin{cases}
t\equiv A\pmod {2X+2Y}\\
t\equiv B\pmod {P+Q}
\end{cases}

連立合同式を満たす最小の非負整数は中国剰余定理を用いて求められる.

F - Zebraness

令和 ABC でフローが出題されたのは初めて?

二値変数がいくつかあって,その関係によって変化するコストを最小化する問題はグラフの最小カットに帰着できる場合がある (燃やす埋める).

今回の問題では,下図のような辺の張り方をすればよい.ただし,u と v は隣接する ? マスである.

図: 辺の張り方